我有一個關于介面在go中的使用的問題。我還在學習這門語言,所以如果這是一個愚蠢的問題,請原諒我。
我正在玩一個接受和處理 TCP 連接的小應用程式。因為我想測驗業務邏輯而不是網路魔法,所以我試圖使用介面讓它保持一點抽象(所以我可以使用簡單的io.ReadWriteCloser物件模擬 net.Conn物件)。
這是我的問題:
type Accepter interface {
Accept() (io.ReadWriteCloser, error)
}
func NewTCPAccepter(address string) (Accepter, error) {
accepter, err := net.Listen("tcp", address)
if err != nil {
return nil, err
}
return accepter, err
}
我看到的錯誤是:
net.Listener does not implement Accepter (wrong type for Accept method)
have Accept() (net.Conn, error)
want Accept() (io.ReadWriteCloser, error)
我不明白的是為什么會發生這種情況,因為檢查檔案和 net lib 源代碼,我看到它net.Conn實際上是在實作io.ReadWriteCloser.
我的錯誤是什么?非常感謝!
uj5u.com熱心網友回復:
我不相信存在愚蠢的問題。如果有一個誠實的問題,就會有求知的沖動,從定義上它不能是愚蠢的:)
Go 依賴方法簽名來決定兩個介面是否相同。如果兩個方法簽名回傳本質上不同的型別,則不能說它們是相等的。
PS如果我表達我的意見,我認為你的Accepter抽象是不合理的。我正在努力解釋它的作用。提出一個好的抽象很困難,我很確定現有的抽象已經足以做你想做的事——測驗你的業務邏輯。
假設您的業務邏輯決議 JSON 檔案并將其轉換為人類可讀的文本。您可以將其打包為具有以下簽名的函式:
func DescribeDocument(src io.Reader, dst io.Writer) error {
...
}
您可以將實作net.Conn介面的物件傳遞給生產代碼中的此函式或bytes.Buffer測驗代碼中的物件。無需發明不必要的抽象:)
uj5u.com熱心網友回復:
該錯誤準確地告訴您問題是什么:
net.Listener does not implement Accepter (wrong type for Accept method)
have Accept() (net.Conn, error)
want Accept() (io.ReadWriteCloser, error)
您的回傳時間與介面定義的回傳時間不同。再看一下錯誤訊息have和want陳述句。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404496.html
標籤:
