インターフェイスと互換性のない構造体を返す 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.
説明:
structToConstruct 型を宣言するとき、factoryFunction が myInterface を返す関数である必要があることを指定します。ただし、高価な.CreateInstance 関数は *myStruct 値を返しますが、これは myInterface に直接割り当てることはできません。これは、Go インターフェイスが型安全性を提供しており、特定の構造体型 (*myStruct など) を返す関数は、実装されているインターフェイス型を返す関数に自動的に変換できないためです。
*myStruct を使用するにはmyInterface の値を使用する場合は、型アサーションを使用するか、変換をラップするアダプター関数を作成して明示的に変換する必要があります:
func wrapper() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
以上がインターフェイスを実装する構造体を返す Go 関数がインターフェイスを返す関数フィールドを満たさないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。