我有一个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.Buffer
as io.Writer
,这更重要。
请参阅相关内容:Go 中是否存在未命名参数?以及为什么 Go 允许编译未使用的函数参数?
- 1 回答
- 0 关注
- 69 浏览
添加回答
举报
0/150
提交
取消