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

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

Barbara Streisand
Barbara Streisand原創
2024-12-06 20:28:13913瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn