Go:总是返回零错误来实现接口
Go: Returning always nil error to implement interface
我有一个 interface
:
type encoder interface {
encode() ([]byte, error)
}
encoder
return和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
}
是否idiomatic/correct说一个方法会return一个错误,即使它总是nil
,所以它符合interface
?我有 boolEncoder.encode
returning 一个 error
只是为了它符合 encoder
并且可以这样使用。
这完全可以/正常。通常实现接口比减少(方法的)代码更重要。
标准库中也有很多示例。
例如bytes/Buffer.Write()
implements io.Writer
和
func (b *Buffer) Write(p []byte) (n int, err error)
但是写入 in-memory 缓冲区不会失败,它记录了它永远不会 return 非 nil
错误:
Write appends the contents of p to the buffer, growing the buffer as needed. The return value n is the length of p; err is always nil. If the buffer becomes too large, Write will panic with ErrTooLarge.
Buffer.Write()
可能有一个不 return 任何东西的签名,因为它的 return 值不携带任何信息(n
总是 len(p)
和 err
始终是 nil
),但是你不能将 bytes.Buffer
用作 io.Writer
,这更重要。
查看相关内容: and Why does Go allow compilation of unused function parameters?
我有一个 interface
:
type encoder interface {
encode() ([]byte, error)
}
encoder
return和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
}
是否idiomatic/correct说一个方法会return一个错误,即使它总是nil
,所以它符合interface
?我有 boolEncoder.encode
returning 一个 error
只是为了它符合 encoder
并且可以这样使用。
这完全可以/正常。通常实现接口比减少(方法的)代码更重要。
标准库中也有很多示例。
例如bytes/Buffer.Write()
implements io.Writer
和
func (b *Buffer) Write(p []byte) (n int, err error)
但是写入 in-memory 缓冲区不会失败,它记录了它永远不会 return 非 nil
错误:
Write appends the contents of p to the buffer, growing the buffer as needed. The return value n is the length of p; err is always nil. If the buffer becomes too large, Write will panic with ErrTooLarge.
Buffer.Write()
可能有一个不 return 任何东西的签名,因为它的 return 值不携带任何信息(n
总是 len(p)
和 err
始终是 nil
),但是你不能将 bytes.Buffer
用作 io.Writer
,这更重要。
查看相关内容: