Go:将始终零错误返回到实现接口



我有一个interface:

type encoder interface {
encode() ([]byte, error)
}

encoder的一些实现返回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,并且可以这样使用。

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

标准库中也有许多示例。

例如,bytes/Buffer.Write()使用实现io.Writer

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

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

Write将p的内容附加到缓冲区,根据需要增加缓冲区。返回值n是p的长度err始终为零。如果缓冲区变得太大,Write将因ErrTooLarge而死机。

Buffer.Write()可能有一个不返回任何内容的签名,因为它的返回值不携带任何信息(n总是len(p)err总是nil(,但您不能将bytes.Buffer用作io.Writer,这更重要。

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

最新更新