为了账号安全,请及时绑定邮箱和手机立即绑定

Go:总是返回零错误来实现接口

Go:总是返回零错误来实现接口

Go
精慕HU 2022-11-23 20:36:36

我有一个interface:


type encoder interface {

    encode() ([]byte, error)

}

encoderreturn an 的一些实现error:


type fooEncoder string


func (e fooEncoder) encode() ([]byte, error) {

    if isSomeValidityCheck(e) {

        return []byte(e), nil

    }

    return nil, fmt.Errorf("Invalid type!")

}

但是对于其他人来说,永远不会有错误:


type boolEncoder bool


func (e boolEncoder) encode() ([]byte, error) {

    if e {

        return []byte{0xff}, nil

    }

    return []byte{0x00}, nil

}

说一个方法将返回一个错误是惯用的/正确的,即使它总是是nil,所以它符合一个interface?我只boolEncoder.encode返回一个error,以便它符合encoder并可以这样使用。


查看完整描述

1 回答

?
慕运维8079593

TA贡献1595条经验 获得超5个赞

这完全正常/正常。通常实现接口比减少(方法的)代码更重要。

标准库中也有很多示例。

例如用bytes/Buffer.Write()_io.Writer

func (b *Buffer) Write(p []byte) (n int, err error)

但是写入内存缓冲区不会失败,它记录了它永远不会返回非nil错误:

Write 将 p 的内容附加到缓冲区,根据需要增大缓冲区。返回值n为p的长度;错误总是 nil。如果缓冲区变得太大,Write 将因 ErrTooLarge 而崩溃。

Buffer.Write()可能有一个不返回任何东西的签名,因为它的返回值不携带任何信息(n总是len(p)并且err总是nil),但是你不能使用bytes.Bufferas io.Writer,这更重要。

请参阅相关内容:Go 中是否存在未命名参数?以及为什么 Go 允许编译未使用的函数参数?


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信