ホームページ > バックエンド開発 > Golang > Goでインターフェイスを実装する構造体を返す関数を割り当てる方法?

Goでインターフェイスを実装する構造体を返す関数を割り当てる方法?

Barbara Streisand
リリース: 2024-12-06 20:28:13
オリジナル
888 人が閲覧しました

How to Assign a Function Returning a Struct Implementing an Interface in Go?

インターフェイスで構造体を返す Go 関数型の使用

質問:

Go では、構造体が 1 つにありますインターフェースを実装するパッケージ。別の依存パッケージで、テスト目的でこの構造体の偽の実装を作成したいと考えています。しかし、インターフェイスを実装する構造体を返す関数をそのインターフェイスの変数に割り当てようとすると、Go はタイプ セーフについて不平を言います。

Architecture:

// Package expensive
type myStruct struct{}

func (m *myStruct) DoSomething() {...}
func (m *myStruct) DoSomethingElse() {...}
func CreateInstance() *myStruct {...} // Expensive to call

// Package main
type myInterface interface {
    DoSomething()
}

type structToConstruct struct {
    factoryFunction func() myInterface
}
func (s *structToConstruct) performAction() {...}
ログイン後にコピー

エラー:

「高価な.CreateInstance (タイプfunc() *expensive.myStruct) as type func() myInterface in field value"

回答:

CreateInstance 関数が *myStruct 値を返すために問題が発生します。これは、factoryFunction で必要な func() myInterface タイプとは異なります。これを解決するには:

// Package main
type myInterface interface {
    DoSomething()
}

type myStruct struct{}

func (m *myStruct) DoSomething() {...}

func getInstance() myInterface {
    return &myStruct{}
}
ログイン後にコピー

この変更により、getInstance は myInterface タイプを返すようになり、それを FactoryFunction に割り当てることができるようになります。

追加メモ:

  • 元々、この質問には、構造体自体ではなく構造体へのポインタを返す関数タイプが含まれていました。これにより型の不一致が発生しました。
  • この動作を元のコードで実装するには、ラッパー関数を使用できます。
wrapper := func() myInterface {
    return expensive.CreateInstance()
}
ログイン後にコピー

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

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