我有一個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并且可以這樣使用。
uj5u.com熱心網友回復:
這完全沒問題/正常。通常,實作介面比減少(方法的)代碼更重要。
標準庫中也有許多示例。
例如bytes/Buffer.Write()實作io.Writer與
func (b *Buffer) Write(p []byte) (n int, err error)
但是寫入記憶體緩沖區不會失敗,它記錄了它永遠不會回傳非nil錯誤:
寫入將 p 的內容附加到緩沖區,根據需要增加緩沖區。回傳值n是p的長度;err 總是 nil。如果緩沖區變得太大,Write 將出現 ErrTooLarge 恐慌。
Buffer.Write()可能有一個不回傳任何東西的簽名,因為它的回傳值不攜帶任何資訊(n總是len(p)和err總是nil),但是你不能使用bytes.Bufferas an io.Writer,這更重要。
請參閱相關:Go 中是否存在未命名引數?為什么 Go 允許編譯未使用的函式引數?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/453004.html
