首頁 > 後端開發 > Golang > 如何分配一個傳回結構體的函數來實作 Go 中的介面?

如何分配一個傳回結構體的函數來實作 Go 中的介面?

Barbara Streisand
發布: 2024-12-06 20:28:13
原創
887 人瀏覽過

How to Assign a Function Returning a Struct Implementing an Interface in Go?

使用透過介面傳回結構體的Go 函數型別

問題:

在Go 中,我有一個結構體實現接口的包。在另一個依賴套件中,我想建立此結構的假實作以用於測試目的。然而,當我嘗試指派一個傳回實作該介面的變數的介面的結構的函數時,Go 會抱怨類型安全。

架構:

// Package expensive
type myStruct struct{}

func (m *myStruct) DoSomething() {...}
func (m *myStruct) DoSomethingElse() {...}
func CreateInstance() *myStruct {...} // Expensive to call

// Package main
type myInterface interface {
    DoSomething()
}

type structToConstruct struct {
    factoryFunction func() myInterface
}
func (s *structToConstruct) performAction() {...}
登入後複製

錯誤:

「無法使用昂貴的.CreateInstance( expense.myStruct) as type func() myInterface in field value"

答案:

出現此問題是因為 CreateInstance 函數傳回一個 *myStruct 值,該值與來自factoryFunction 所需的func() myInterface 類型。若要解決此問題:

// Package main
type myInterface interface {
    DoSomething()
}

type myStruct struct{}

func (m *myStruct) DoSomething() {...}

func getInstance() myInterface {
    return &myStruct{}
}
登入後複製

透過此修改,getInstance 現在會傳回 myInterface 類型,允許將其指派給factoryFunction。

附加說明:

  • 最初,問題涉及一個傳回結構體指標而不是結構體的函數類型本身,這導致類型不符。
  • 要在原始程式碼中實現此行為,可以使用包裝函數:
wrapper := func() myInterface {
    return expensive.CreateInstance()
}
登入後複製

以上是如何分配一個傳回結構體的函數來實作 Go 中的介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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