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

Go: Returning always nil error to implement interface

我有一个 interface:

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

encoderreturn和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?