ホームページ >バックエンド開発 >Golang >Go のジェネリック関数でスライスの結合を反復処理する方法は?

Go のジェネリック関数でスライスの結合を反復処理する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-05 05:31:08216ブラウズ

How to Iterate Over a Union of Slices in Go Generic Functions?

ジェネリック関数のスライスの共用体を反復処理する

Go のジェネリックスを使用すると、関数がさまざまな型で動作できるようになり、コードの再利用が可能になり、タイプセーフティ。ただし、異なる要素タイプのスライスを操作する場合、汎用関数内でスライスを反復処理するときに問題が発生する可能性があります。

整数または浮動小数点のいずれかを含む可能性があるスライスの要素を合計することを目的とした次の例を考えてみましょう。

package main

import "fmt"

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

func add[N NumberSlice](n N) {
    // want: to range over n and print value of v
    for _, v := range n {
        fmt.Println(v)
    }
}

func main() {
    ints := []int64{1, 2}
    add(ints)
}

このコードを実行すると、次のエラーが発生します:

cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)

問題はNumberSlice インターフェイス制約の「コア タイプ」がありません。コア型は、インターフェイスの型セット内のすべての型によって共有される単一の基礎となる型を表します。 NumberSlice は []int64 と []float64 の両方を包含するため、コア型がありません。

この問題を解決するには、いくつかのアプローチがあります。

  1. 共通の基本タイプを強制する:
    基本タイプを指定し、スライス タイプを規定するようにインターフェイス制約を変更します。関数シグネチャ内:

    type Number interface {
        int64 | float64
    }
    
    func add[N Number](n []N) {
        for _, v := range n {
            fmt.Println(v)
        }
    }
  2. 明示的な型付けでジェネリックを使用する:
    要素の型を指定するジェネリック スライス型を宣言し、明示的な型付けを使用して希望の要素を指定してくださいtype:

    type NumberSlice[N int64 | float64] interface {
        ~[]N // indicates a core type of []N
    }
    
    func add[S NumberSlice[N], N int64 | float64](n S) {
        for _, v := range n {
            fmt.Println(v)
        }
    }

コア型を指定すると、コンパイラは適切な反復動作を推論し、ジェネリック関数内のスライスを反復するという目的の操作を可能にします。

以上がGo のジェネリック関数でスライスの結合を反復処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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