インターフェイス内で構造体を返す 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() }
ここでは、 *myStruct.次に、*myStruct が実装するインターフェイス myInterface を作成しました。ただし、myInterface を返す関数を予期する structToConstruct 内のフィールドにファクトリ関数を割り当てたため、コンパイル エラーが発生しました。
問題の解決
これを解決するには、次の手順を実行します。 2 つのオプションがあります:
wrapper := func() myInterface { return expensive.CreateInstance() } thing := structToConstruct{wrapper}
func CreateInstance() myInterface { return &myStruct{} }
選択肢 1 を選択する理由Works
オプション 1 では、ラッパー関数は CreateInstance の結果を FactoryFunction に割り当てる前に myInterface に変換します。ラッパー関数が予期される関数型と一致するため、これは structToConstruct の型署名を満たします。
オプション 2 にプロポーザル 12754 が必要な理由
オプション 2 で、直接CreateInstance を FactoryFunction に割り当てると、CreateInstance はインターフェイスではなく構造化ポインターを返すため、Go は文句を言います。提案 12754 は、そのような割り当てをサポートするために言語を拡張することを提案していますが、最終的には拒否されました。
以上がインターフェイスを実装する構造体を返す Go 関数を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。