我有一个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允许编译未使用的函数参数?