首頁 > 後端開發 > Golang > 為什麼 Go 函數傳回實作介面的結構體不滿足介面回傳函數欄位?

為什麼 Go 函數傳回實作介面的結構體不滿足介面回傳函數欄位?

DDD
發布: 2024-12-05 12:53:16
原創
541 人瀏覽過

Why Doesn't a Go Function Returning a Struct Implementing an Interface Satisfy an Interface-Returning Function Field?

Go 函數類型傳回的結構體與介面不相容

問題:

問題:

在Go 中,為什麼傳回實作介面的結構的函數是否不滿足期望欄位的類型要求傳回該介面的函數?

答案:

問題在於返回結構體的 Go 函數類型與返回結構體的函數類型不能互換接口,即使該結構實現了該接口。在為結構體中的函數聲明類型簽署時,特定的返回類型必須與聲明的類型相符。修改工廠函數直接傳回介面類型即可解決問題。

package main

import "fmt"

func main() {
    thing := structToConstruct{getInstance}
    thing.performAction()
}

type myInterface interface {
    doSomething()
}

type structToConstruct struct {
    factoryFunction func() myInterface
}

func (s *structToConstruct) performAction() {
    instance := s.factoryFunction()
    instance.doSomething()
}

func getInstance() myInterface {
    return &myStruct{}
}

type myStruct struct{}

func (m *myStruct) doSomething() {
    fmt.Println("doing something")
}
登入後複製

範例:

本例修改工廠函數傳回實例myInterface的,滿足以下類型要求structToConstruct.

說明:

func wrapper() myInterface {
    return expensive.CreateInstance()
}

thing := structToConstruct{wrapper}
登入後複製
聲明structToConstruct類型時,我們指定factoryFunction應該是傳回myInterface的函數。但是,expense.CreateInstance 函數傳回*myStruct 值,不能直接指派給myInterface。這是因為 Go 介面提供類型安全性,而傳回特定結構類型(例如 *myStruct)的函數無法自動轉換為傳回其實作的介面類型的函數。 要使用 *myStruct value 與 myInterface,我們必須使用類型斷言或透過建立包裝轉換的適配器函數來明確轉換它:

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

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