假设我们想在 error
接口(interface)上扩展 Error()
函数。我们可以简单地创建一个从实现 Error()
方法的字符串派生的结构。例如:
type NewUser struct {
Email string
Password string
}
type ErrMissingField string
func (e ErrMissingField) Error() string {
return string(e) + " is required"
}
func (u *NewUser) OK() error {
if len(u.Email) == 0 {
return ErrMissingField("email")
}
if len(u.Password) == 0 {
return ErrMissingField("password")
}
return nil
}
以上代码将返回需要电子邮件
或需要密码
。
但是,如果我创建自己的界面,假设是 ResponseError
,如下所示:
type ResponseError interface {
ErrorMsg() string
}
type CustomErr string
func (c CustomErr) ErrorMsg() string {
return "[Error] " + string(c)
}
func (u *NewUser) NewOK() ResponseError {
if len(u.Email) == 0 {
return CustomErr("Email required!")
}
if len(u.Password) == 0 {
return CustomErr("Password Required!")
}
return nil
}
它不会打印我用[Error]
编写的方法实现。它只是打印我传递到结构 Email required!
或 Password Required!
中的字符串。
如何解决这个问题?
最佳答案
如果你使用fmt打印,那么从https://golang.org/pkg/fmt
如果操作数实现了错误接口(interface),将调用 Error 方法将对象转换为字符串,然后根据动词(如果有)要求格式化。
如果操作数实现了 String() string 方法,将调用该方法将对象转换为字符串,然后根据动词(如果有)的要求格式化
这就是为什么当您实现Error 接口(interface)时,它通过调用Error()
函数来打印。如果您想要自定义输出其他接口(interface)(如 ResponseError
),请实现 String()
方法。
package main
import (
"fmt"
)
type NewUser struct {
Email string
Password string
}
type ResponseError interface {
ErrMsg()
String() string
}
type CustomErr string
func (c CustomErr) String() string {
return "[Error] " + string(c)
}
func (c CustomErr) ErrMsg() {}
func (u *NewUser) NewOK() ResponseError {
if len(u.Email) == 0 {
return CustomErr("Email required!")
}
if len(u.Password) == 0 {
return CustomErr("Password Required!")
}
return nil
}
func main() {
u := &NewUser{}
fmt.Println(u.NewOK())
}
去 Playground :https://play.golang.org/p/khAAtLodEND
关于go - Golang 中的返回接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53456319/