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{} }この変更により、
myStruct が myInterface インターフェイスを実装するようになります。 getInstance 関数は正しい値を返しますtype.
上記のアプローチは機能しますが、Go は、具象型がインターフェイスを実装している場合に、具象型を返す関数をインターフェイスを返す関数に自動的に変換する言語変更を提案しました。しかし、この提案は潜在的なパフォーマンスと安全性の懸念により拒否されました。以上が構造体ポインターを返す Go 関数がインターフェイスを自動的に実装しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。