go - Golang 中的返回接口(interface)

标签 go methods interface

假设我们想在 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

  1. 如果操作数实现了错误接口(interface),将调用 Error 方法将对象转换为字符串,然后根据动词(如果有)要求格式化。

  2. 如果操作数实现了 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/

相关文章:

java - 对一长串参数进行空检查的好方法

c++ - 在 C++ 状态机中实现事件条件

api - GoLang/Mux 语法问题 : if ID, Ok = mux.Vars(r) ["ID"]; !行

Golang 类型开关 : How to match a generic slice/array/map/chan?

networking - 我可以使用 mime/multipart 阅读器从 Conn 读取数据吗?

c# - 如何初始化一个接口(interface)?

java - 从自定义数据结构类返回流

go - 如何检索嵌套的 map 值

c# - 为什么C#只允许最后一个参数为 "params type"

c# - 属性和方法之间的界线应该在哪里?