首頁 > 後端開發 > Golang > 如何處理 Go 函數返回實作介面的結構?

如何處理 Go 函數返回實作介面的結構?

Barbara Streisand
發布: 2024-12-08 04:18:09
原創
516 人瀏覽過

How Can I Handle Go Functions Returning Structs Implementing Interfaces?

在介面內傳回結構體的 Go 函數型別

在 Go 中,通常會使用介面來定義結構體的行為。但是,在使用傳回實作介面的結構的函數時,您可能會遇到類型安全性錯誤。

理解問題

讓我們檢查您提供的程式碼範例:

package expensive

type myStruct struct { ... } // Struct with time-consuming methods
func CreateInstance() *myStruct { ... } // Expensive factory function
登入後複製
package main

import "expensive"

type myInterface interface { DoSomething() }
type structToConstruct struct { factoryFunction func() myInterface }
func (s *structToConstruct) performAction() { instance := s.factoryFunction(); instance.DoSomething() }
登入後複製

在這裡,您定義了一個工廠函數CreateInstance,它傳回一個*我的結構。然後,您建立了 *myStruct 實作的介面 myInterface。但是,您將工廠函數指派給 structToConstruct 中需要傳回 myInterface 的函數的字段,從而導致編譯錯誤。

解決問題

要解決這個問題,您有兩個選項:

  1. 包裝函數:你可以將您的工廠函數包裝在主包中。例如:
wrapper := func() myInterface { return expensive.CreateInstance() }
thing := structToConstruct{wrapper}
登入後複製
  1. 修改工廠函數: 或者,您可以修改CreateInstance 直接傳回myInterface:
func CreateInstance() myInterface { return &myStruct{} }
登入後複製

為什麼選擇1有效

在選項1中,包裝函數將CreateInstance的結果轉換為myInterface,然後將其指派給factoryFunction。這滿足 structToConstruct 的類型簽名,因為包裝函數與預期的函數類型相符。

為什麼選項2 需要提案12754

在選項2 中,如果您嘗試直接將CreateInstance分配給factoryFunction,Go會抱怨,因為CreateInstance返回的是結構化指針,而不是接口。提案 12754 建議擴展語言以支援此類作業,但最終被拒絕。

以上是如何處理 Go 函數返回實作介面的結構?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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