ホームページ >バックエンド開発 >Golang >Go ジェネリックスのユニオン制約は、明示的なインターフェイス宣言なしで共有メソッドを呼び出すことができますか?

Go ジェネリックスのユニオン制約は、明示的なインターフェイス宣言なしで共有メソッドを呼び出すことができますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-22 16:34:13595ブラウズ

Can Go Generics' Union Constraints Call Shared Methods Without Explicit Interface Declaration?

Go ジェネリックでの共用体制約のメソッドの呼び出し

Go ジェネリック (v1.18) では、制限を制限する型共用体制約が発生する可能性があります。パラメータの型を、統一インターフェイスを実装する型に変更します。ただし、制約された型間で共有メソッドを呼び出すことができないため、そのような制約の有用性について懸念が生じます。

次のコードを考えてみましょう:

type A struct {}
type B struct {}
type AB interface { *A | *B }

func (a *A) some() bool { return true }
func (b *B) some() bool { return false }

func some[T AB](x T) bool { return x.some() } // Compiler error

コンパイラ エラー「x.some unknown」これは、型共用体制約 *A | が存在するためです。 *B は、*A と *B の両方にメソッドが存在することを保証しません。

この問題を解決するには、インターフェイス制約にメソッドを追加できます。

type AB interface { *A | *B; some() bool }

func some[T AB](x T) bool { return x.some() } // Works

これT は、*A または *B の両方を実装し、メソッドを宣言する型に制限されます。

ただし、この解決策は、型共用体で理想的に機能するものに対する回避策と見なされます。 一人で。 Go 1.18 には現在、メソッド m が P の制約インターフェイスによって明示的に宣言されている場合にのみ、コンパイラが型パラメーター P の値に対するメソッドの呼び出しをサポートするという制限があります。言語仕様では、インターフェイスのメソッド セットは、インターフェイスの型セット内の各型のメソッド セットの共通部分であると述べられています。この問題は Go 1.19 で解決される予定です。

以上がGo ジェネリックスのユニオン制約は、明示的なインターフェイス宣言なしで共有メソッドを呼び出すことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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