我有一個interface:type encoder interface { encode() ([]byte, error)}encoderreturn an 的一些實現(xiàn)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條經(jīng)驗 獲得超5個贊
這完全正常/正常。通常實現(xiàn)接口比減少(方法的)代碼更重要。
標準庫中也有很多示例。
例如用bytes/Buffer.Write()
_io.Writer
func (b *Buffer) Write(p []byte) (n int, err error)
但是寫入內(nèi)存緩沖區(qū)不會失敗,它記錄了它永遠不會返回非nil
錯誤:
Write 將 p 的內(nèi)容附加到緩沖區(qū),根據(jù)需要增大緩沖區(qū)。返回值n為p的長度;錯誤總是 nil。如果緩沖區(qū)變得太大,Write 將因 ErrTooLarge 而崩潰。
Buffer.Write()
可能有一個不返回任何東西的簽名,因為它的返回值不攜帶任何信息(n
總是len(p)
并且err
總是nil
),但是你不能使用bytes.Buffer
as io.Writer
,這更重要。
請參閱相關內(nèi)容:Go 中是否存在未命名參數(shù)?以及為什么 Go 允許編譯未使用的函數(shù)參數(shù)?
- 1 回答
- 0 關注
- 103 瀏覽
添加回答
舉報
0/150
提交
取消