「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > **スライスの初期化に Go でジェネリックスを使用する場合に、インターフェイスと実装者の関係を維持する方法は?**

**スライスの初期化に Go でジェネリックスを使用する場合に、インターフェイスと実装者の関係を維持する方法は?**

2024 年 11 月 5 日に公開
ブラウズ:644

**How to Preserve Interface-Implementor Relationships When Using Generics in Go for Slice Initialization?**

Golang ジェネリックにおけるインターフェイス/実装の同時性

スライスに初期化された値を埋めるジェネリック関数を作成するタスクを考えてみましょう。これは簡単そうに見えますが、インターフェイスのスライスを利用して関数内で具体的な型を指定しようとすると課題が発生します。

Go 1.18 では、X と Y の両方をジェネリック関数 Fill 内の任意の型として制約すると、損失が生じます。インターフェースとその実装者との間の関係。これにより、関数内で Y のインスタンスをスライス[i]に割り当てることができなくなります。

これを克服するには、明示的なアサーションを使用できます:

func Fill[X, Y any](slice []X) {
    for i := range slice {
        slice[i] = any(*new(Y)).(X)
    }
}

ただし、このアプローチは、Y が X を実装していない場合にパニックになります。さらに、Y にポインター型を使用すると、基本型と nil ベースライン値に関する情報が失われます。

Toこれらの問題に対処するには、2 番目の型パラメーターの代わりにコンストラクター関数を使用することをお勧めします:

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()
    }
}

このアプローチは、コンストラクター関数によって作成された初期化された値でスライスを効果的に埋め、問題に対するより堅牢で柔軟な解決策を提供します。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3