ホームページ >バックエンド開発 >Golang >構造体ポインターを返す Go 関数がインターフェイスを自動的に実装しないのはなぜですか?

構造体ポインターを返す Go 関数がインターフェイスを自動的に実装しないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-20 13:13:13283ブラウズ

Why Doesn't a Go Function Returning a Struct Pointer Automatically Implement an Interface?

Go でのインターフェイス実装: 構造体を返す関数の型

Go を使用する場合、関数が構造体を返す状況によく遭遇します。インターフェイスを実装します。ただし、インターフェイスのインスタンスを期待するフィールドに関数を割り当てようとすると、「フィールド値のタイプ [インターフェイス] として [関数] を使用できません」のようなエラーが発生する可能性があります。

これを理解するにはエラーがある場合は、構造体 (struct) へのポインターを返す関数が、その構造体に定義されたインターフェイスを自動的に実装しないことを明確にすることが重要です。言い換えると、struct と struct は Go では異なる型です。

この例では、関数 getInstance は型 myInterface、これは特定の実装 (構造体) ではなく、動作 (インターフェイス) の説明です。ただし、getInstance は、myStruct 実装 (*myStruct) へのポインターを返します。これは、myInterface と型互換性がありません。

この問題では、

getInstance を変更して、 myStruct 構造体。以下の修正されたコードに見られます。

package main

import "fmt"

func main() {
    var function func() myInterface

    function = getInstance

    newSomething := function()

    newSomething.doSomething()
}

type myInterface interface {
    doSomething()
}

type myStruct struct{}

func (m *myStruct) doSomething() {
    fmt.Println("doing something")
}

func getInstance() myInterface {
    return &myStruct{}
}
この変更により、

myStructmyInterface インターフェイスを実装するようになります。 getInstance 関数は正しい値を返しますtype.

上記のアプローチは機能しますが、Go は、具象型がインターフェイスを実装している場合に、具象型を返す関数をインターフェイスを返す関数に自動的に変換する言語変更を提案しました。しかし、この提案は潜在的なパフォーマンスと安全性の懸念により拒否されました。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。