ホームページ > バックエンド開発 > Golang > インターフェイスを実装する構造体を返す Go 関数がインターフェイスを返す関数フィールドを満たさないのはなぜですか?

インターフェイスを実装する構造体を返す Go 関数がインターフェイスを返す関数フィールドを満たさないのはなぜですか?

DDD
リリース: 2024-12-05 12:53:16
オリジナル
539 人が閲覧しました

Why Doesn't a Go Function Returning a Struct Implementing an Interface Satisfy an Interface-Returning Function Field?

インターフェイスと互換性のない構造体を返す 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 サイトの他の関連記事を参照してください。

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