ホームページ > バックエンド開発 > Golang > Go でインターフェイスを返すインターフェイス メソッドを具象型の実装が満たさないのはなぜですか?

Go でインターフェイスを返すインターフェイス メソッドを具象型の実装が満たさないのはなぜですか?

DDD
リリース: 2024-10-26 22:48:03
オリジナル
466 人が閲覧しました

Why Doesn't a Concrete Type Implementation Satisfy an Interface Method Returning an Interface in Go?

インターフェイス メソッドが具象型の実装とインターフェイスの不一致を返す

Go では、インターフェイスを返すインターフェイス メソッドは、具象型ではなく、インターフェイス自体を宣言する実装とのみ一致します。インターフェースを実装する型。次の例を考えてみましょう:

<code class="go">package main

import "fmt"

type Foo struct {
    val string
}

func (f *Foo) String() string {
    return f.val
}

type StringerGetter interface {
    GetStringer() fmt.Stringer
}

type Bar struct{}

func (b *Bar) GetStringer() *Foo {
    return &Foo{"foo"}
}

func Printer(s StringerGetter) {
    fmt.Println(s.GetStringer())
}

func main() {
    f := Bar{}
    Printer(&f) // compile-time error
}</code>
ログイン後にコピー

このコードでは、次のコンパイル時エラーが発生します:

cannot use &f (type *Bar) as type StringerGetter in argument to Printer:  *Bar does not implement StringerGetter (wrong type for GetStringer method)
ログイン後にコピー

この問題を解決するには、Bar 型の GetStringer メソッドが fmt を返す必要があります。具象 *Foo 型の代わりに .Stringer インターフェイスを使用するか、インターフェイスの代わりに具象型を受け入れるように StringerGetter インターフェイスを変更する必要があります。

代替ソリューション

外部具象型を変更する場合または共有インターフェイスが望ましくない場合は、2 つの代替解決策があります:

  1. ラッパー型の作成: 外部具象型をラップし、目的の型を実装する新しい型を作成できます。インタフェース。例:
<code class="go">type MyBar struct {
    Bar
}

func (b *MyBar) GetStringer() fmt.Stringer {
    return b.Bar.GetStringer()
}</code>
ログイン後にコピー
  1. 具象型の埋め込み: または、外部具象型を独自の型に埋め込み、その埋め込まれた型を使用してインターフェイスを実装することもできます。方法。例:
<code class="go">type MyBar struct {
    embed Bar
}

func (b *MyBar) GetStringer() fmt.Stringer {
    return b.GetStringer()
}</code>
ログイン後にコピー

どちらのアプローチでも、元の型や共有インターフェイスを変更せずに、目的のインターフェイス実装を提供しながら、外部の具象型を操作できます。

以上がGo でインターフェイスを返すインターフェイス メソッドを具象型の実装が満たさないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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