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

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

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

Go
精慕HU 2022-11-23 20:36:36
我有一个interface:type encoder interface {    encode() ([]byte, error)}encoderreturn an 的一些实现error:type fooEncoder stringfunc (e fooEncoder) encode() ([]byte, error) {    if isSomeValidityCheck(e) {        return []byte(e), nil    }    return nil, fmt.Errorf("Invalid type!")}但是对于其他人来说,永远不会有错误:type boolEncoder boolfunc (e boolEncoder) encode() ([]byte, error) {    if e {        return []byte{0xff}, nil    }    return []byte{0x00}, nil}说一个方法将返回一个错误是惯用的/正确的,即使它总是是nil,所以它符合一个interface?我只boolEncoder.encode返回一个error,以便它符合encoder并可以这样使用。
查看完整描述

1 回答

?
慕运维8079593

TA贡献1876条经验 获得超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
  • 1 回答
  • 0 关注
  • 69 浏览
慕课专栏
更多

添加回答

举报

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