ホームページ  >  記事  >  バックエンド開発  >  golang の変数パラメータはジェネリック関数で使用できますか?

golang の変数パラメータはジェネリック関数で使用できますか?

PHPz
PHPzオリジナル
2024-04-29 14:06:01393ブラウズ

Go では、可変パラメーターをジェネリック関数に使用できるため、可変数のパラメーターを受け入れ、複数の型に適したジェネリック関数を作成できます。たとえば、指定されたリスト内で最も頻繁に出現する要素を検索する汎用関数 Mode を作成できます。Mode は、型 T の可変数の要素を受け入れます。各要素のカウントを作成することで要素をカウントします。次に、最も多く出現する要素を見つけて、それをモードとして返します。 main 関数では、文字列のリストと整数のリストに対して Mode 関数を呼び出すことができます。これにより、それぞれ最も頻度の高い文字列と数値が返されます。

golang の変数パラメータはジェネリック関数で使用できますか?

Go の可変パラメーターを持つジェネリック関数

序文

Go で導入されたジェネリックスGo 1.18 では、特定の型のパラメーターに依存しない関数と型を作成できます。このブログ投稿では、Go の変数パラメーターが汎用関数に適しているかどうかを調査し、実際的なケースを示します。

Varameters

Varameter 関数は、可変数のパラメーターを受け入れる関数です。 Go では、変数パラメーターは通常、... 構文を使用して表現されます。たとえば、次のようになります。

func Sum(nums ...int) int {
  sum := 0
  for _, num := range nums {
    sum += num
  }
  return sum
}

Generic function

Generic function はパラメーターです。 type 割り当て可能な関数。 Go では、ジェネリック関数は [] 構文を使用して表現されます。たとえば、次のようになります。

func Max[T comparable](values ...T) T {
  max := values[0]
  for _, value := range values {
    if value > max {
      max = value
    }
  }
  return max
}

変数パラメーターとジェネリックス

変数パラメーターとジェネリックスGo で一緒に使用すると、可変数の引数を受け入れ、複数の型を処理する汎用関数を作成できます。

実際的なケース

タスクの目的: 指定されたリスト内で最も多く出現する要素を検索する汎用関数を作成します。

コード:

import "fmt"

func Mode[T comparable](values ...T) T {
  counts := map[T]int{}
  var mode T
  var maxCount int

  // 统计元素计数
  for _, value := range values {
    counts[value]++
  }

  // 找出出现次数最多的元素
  for value, count := range counts {
    if count > maxCount {
      maxCount = count
      mode = value
    }
  }

  return mode
}

func main() {
  // 字符串列表
  strs := []string{"apple", "orange", "apple", "pear", "banana"}
  fmt.Println("最常见的字符串:", Mode(strs...)) // apple

  // 整数列表
  nums := []int{1, 2, 3, 2, 4, 2, 5}
  fmt.Println("最常见的数字:", Mode(nums...)) // 2
}

説明:

  • Mode この関数はジェネリックです。 T 型の可変数の要素を受け入れる関数。
  • 最も多く出現する要素を返し、各要素の出現数を counts でカウントします。
  • main 関数では、文字列のリストと整数のリストという 2 つのリストを作成し、各リストに対して Mode 関数を呼び出します。
  • 出力は、最も頻繁に出現する要素が "apple" (文字列のリストの場合) と 2 (整数のリストの場合) であることを示しています。

以上がgolang の変数パラメータはジェネリック関数で使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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