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

我有一个interface:


type encoder interface {

    encode() ([]byte, error)

}

encoderreturn an 的一些实现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并可以这样使用。


精慕HU
浏览 72回答 1
1回答

慕运维8079593

这完全正常/正常。通常实现接口比减少(方法的)代码更重要。标准库中也有很多示例。例如用bytes/Buffer.Write()_io.Writerfunc (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.Bufferas io.Writer,这更重要。请参阅相关内容:Go 中是否存在未命名参数?以及为什么 Go 允许编译未使用的函数参数?
打开App,查看更多内容
随时随地看视频慕课网APP