Go ジェネリック: 型結合の共有メソッドのロックを解除する
Go の新しいジェネリック機能では、型結合制約により複数の型をバインドできます。単一のジェネリック型パラメーター。ただし、これらの型間で共有メソッドをどのように利用できるのかという疑問が生じます。
初期試行とコンパイラ エラー
<br>type AB Interface { </p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">*A | *B
}
関数 (a *A) some() bool {
return true
}
func (b *B) some() bool {
return false
}
関数 some[T AB](x T) bool {
return x.some() // undefined
}
上記のコードは、関数 some で共有の some メソッドを使用しようとしますが、コンパイラがどちらのメソッドを使用するかを判断できないため、エラーが発生します。呼び出すメソッド。
インターフェイスを使用した回避策制約
この制限を克服するには、共有メソッドをインターフェイス制約に直接追加できます:
<br>タイプ AB インターフェイス {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">*A | *B some() bool
}
func some[TAB](x T) bool {
return x.some() // works
}
これにより、ジェネリック型 T が some メソッドを含むインターフェイス制約を満たす必要があります。
Go 1.18 の制限
次のことが重要ですこの回避策は Go 1.18 の制限による一時的な措置であることに注意してください。 Go 仕様では共有メソッドを型共用体で使用できますが、現在のコンパイラ実装では制約インターフェイスで明示的に宣言されたメソッドに制限されています。
Go 1.19 での解決
Go 1.18 リリースノートはこの制限を認めており、Go 1.19 でそれを削除し、型共用体の共有メソッドに直接アクセスできるようにする計画を明示しています。この改善により、Go ジェネリックの表現力と柔軟性が強化されます。
以上がGo Generics の型結合制約で共有メソッドをどのように使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。