ホームページ > バックエンド開発 > Golang > インターフェイスを実装する構造体を返す Go 関数を処理するにはどうすればよいですか?

インターフェイスを実装する構造体を返す Go 関数を処理するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-08 04:18:09
オリジナル
517 人が閲覧しました

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() }
ログイン後にコピー

ここでは、 *myStruct.次に、*myStruct が実装するインターフェイス myInterface を作成しました。ただし、myInterface を返す関数を予期する structToConstruct 内のフィールドにファクトリ関数を割り当てたため、コンパイル エラーが発生しました。

問題の解決

これを解決するには、次の手順を実行します。 2 つのオプションがあります:

  1. ラッパー関数:メインパッケージ内にファクトリー関数をラップできます。例:
wrapper := func() myInterface { return expensive.CreateInstance() }
thing := structToConstruct{wrapper}
ログイン後にコピー
  1. 改訂されたファクトリー関数: または、CreateInstance を変更して myInterface を直接返すこともできます:
func CreateInstance() myInterface { return &myStruct{} }
ログイン後にコピー

選択肢 1 を選択する理由Works

オプション 1 では、ラッパー関数は CreateInstance の結果を FactoryFunction に割り当てる前に myInterface に変換します。ラッパー関数が予期される関数型と一致するため、これは structToConstruct の型署名を満たします。

オプション 2 にプロポーザル 12754 が必要な理由

オプション 2 で、直接CreateInstance を FactoryFunction に割り当てると、CreateInstance はインターフェイスではなく構造化ポインターを返すため、Go は文句を言います。提案 12754 は、そのような割り当てをサポートするために言語を拡張することを提案していますが、最終的には拒否されました。

以上がインターフェイスを実装する構造体を返す Go 関数を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート