ホームページ >バックエンド開発 >Golang >コアタイプを使用せずに Go ジェネリック関数でスライスの結合を反復処理するにはどうすればよいですか?

コアタイプを使用せずに Go ジェネリック関数でスライスの結合を反復処理するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-23 15:23:10623ブラウズ

How Can I Iterate Over a Union of Slices in a Go Generic Function Without a Core Type?

コア型を使用せずにジェネリック関数のスライスの共用体を反復処理する

Go 1.18 では、ジェネリック関数を使用して型を操作できるようになりますダイナミックに。ただし、さまざまな型で構成されるスライスを反復処理する際に課題が発生する場合は、追加の考慮事項が必要です。

型の制約を扱うときは、コア型の概念を理解する必要があります。コア タイプは、インターフェイス内のすべてのタイプに対して単一の基礎となるタイプが存在する場合、またはすべてのチャネルが同じ要素タイプと方向を持つ場合に存在します。

最初のコード例では:

type NumberSlice interface {
    []int64 | []float64
}

インターフェイス制約 NumberSlice には、複数の基礎となる型 []int64 および []float64 が含まれるため、コア型がありません。これは、このインターフェイスのスライスをまたがることができないことを意味します。

この障害を克服するには、代わりに基本型を要求するようにインターフェイスを変更できます。

type Number interface {
    int64 | float64
}

func add[N Number](n []N) {
    for _, v := range n {
        fmt.Println(v)
    }
}

これにより、次のスライスを宣言できます。 int64 または float64 を使用し、ジェネリック関数内でそれらを反復処理します。

あるいは、コアを使用してより明示的なインターフェイスを定義することもできます。 type:

type NumberSlice[N int64 | float64] interface {
    ~[]N
}

func add[S NumberSlice[N], N int64 | float64](n S) {
    for _, v := range n {
        fmt.Println(v)
    }
}

このアプローチにより、NumberSlice[N] を実装するすべての型に対して、インターフェースが既知の基礎となる型 []N を持つことが保証されます。

これらの調整を行うことで、正常に反復処理できます。ジェネリック関数内のスライスの結合により、コードの柔軟性が向上します。

以上がコアタイプを使用せずに Go ジェネリック関数でスライスの結合を反復処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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