Golang ジェネリックにおけるインターフェイス/実装の同時性
初期化された値でスライスを埋めるジェネリック関数を作成するタスクを考えてみましょう。これは簡単そうに見えますが、インターフェイスのスライスを利用して関数内で具体的な型を指定しようとすると課題が発生します。
Go 1.18 では、X と Y の両方をジェネリック関数 Fill 内の任意の型として制約すると、損失が発生します。インターフェースとその実装者との間のあらゆる関係。これにより、関数内で Y のインスタンスをスライス[i]に割り当てることができなくなります。
これを克服するには、明示的なアサーションを使用できます。
<code class="go">func Fill[X, Y any](slice []X) { for i := range slice { slice[i] = any(*new(Y)).(X) } }</code>
ただし、このアプローチは、Y が指定された場合にパニックになります。は X を実装しません。さらに、Y にポインター型を使用すると、基本型と nil ベースライン値に関する情報が失われます。
これらの問題に対処するには、代わりにコンストラクター関数を使用することをお勧めします。 2 番目の型パラメータ:
<code class="go">func main() { xs := make([]sync.Locker, 10) Fill(xs, func() sync.Locker { return &sync.Mutex{} }) } func Fill[X any](slice []X, f func() X) { for i := range slice { slice[i] = f() } }</code>
このアプローチは、コンストラクター関数によって作成された初期化された値でスライスを効果的に埋め、問題に対するより堅牢で柔軟な解決策を提供します。
以上が**スライスの初期化に Go でジェネリックスを使用する場合に、インターフェイスと実装者の関係を維持する方法は?**の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。