首頁 > 後端開發 > Golang > 為什麼傳回結構體指標的 Go 函數不自動實作介面?

為什麼傳回結構體指標的 Go 函數不自動實作介面?

Linda Hamilton
發布: 2024-12-20 13:13:13
原創
289 人瀏覽過

Why Doesn't a Go Function Returning a Struct Pointer Automatically Implement an Interface?

Go 中的介面實作:傳回結構體的函數型別

使用Go 時,常常會遇到函數傳回結構體的情況實作一個介面。但是,當嘗試將函數指派給需要介面實例的欄位時,您可能會遇到類似於「無法在欄位值中使用 [函數] 作為類型 [介面]」的錯誤。

要理解這一點錯誤,澄清返回結構體指標 (struct) 的函數不會自動實現為該結構體定義的介面是至關重要的。換句話說,struct 和 struct 在 Go 中是不同的類型。

在給定的範例中,函數getInstance 預計返回myInterface,這是行為(介面)的描述而不是具體的實現(結構體)。然而,getInstance傳回一個指向myStruct實作(*myStruct)的指針,它與myInterface型別不相容。

要解決這個問題,你需要修改

getInstance 回傳一個實例myStruct 結構體,如下面更正後的程式碼所示:

package main

import "fmt"

func main() {
    var function func() myInterface

    function = getInstance

    newSomething := function()

    newSomething.doSomething()
}

type myInterface interface {
    doSomething()
}

type myStruct struct{}

func (m *myStruct) doSomething() {
    fmt.Println("doing something")
}

func getInstance() myInterface {
    return &myStruct{}
}
登入後複製
此修改確保

myStruct 實現myInterface 接口,並且getInstance 函數返回正確的type.

雖然上述方法有效,但Go 提出了一項語言更改,如果具體類型實現了接口,則會自動將傳回特定類型的函數轉換為傳回介面的函數。然而,由於潛在的性能和安全問題,該提案被拒絕。

以上是為什麼傳回結構體指標的 Go 函數不自動實作介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板