亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go:總是返回零錯誤來實現接口

Go:總是返回零錯誤來實現接口

Go
精慕HU 2022-11-23 20:36:36
我有一個interface:type encoder interface {    encode() ([]byte, error)}encoderreturn an 的一些實現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條經驗 獲得超5個贊

這完全正常/正常。通常實現接口比減少(方法的)代碼更重要。

標準庫中也有很多示例。

例如用bytes/Buffer.Write()_io.Writer

func (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 允許編譯未使用的函數參數?


查看完整回答
反對 回復 2022-11-23
  • 1 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號