Go言語において、可変引数の関数を扱う際、スライスを引数として、関数が可変数の引数を受け取る場合に非常に便利です。例えば、ログの出力、数値の集計、文字列の結合など、さまざまなシチュエーションで役立ちます。
可変引数の基本
まず、可変引数関数の基本から見ていきましょう。可変引数関数は、任意の数の引数を同じ型で受け取れる関数です。関数定義時には、パラメータの型の前に ...
を置くことで、その型の任意の数の引数を受け取ることを示します。
例:以下の max 関数は、渡された整数の中から最大値を返します。
func max(values ...int) int {
maxVal := values[0]
for _, val := range values[1:] {
if val > maxVal {
maxVal = val
}
}
return maxVal
}
スライスを可変引数に展開する
次に、あるスライスから条件に合う値のみを選び出し、それを max 関数に渡す例を見てみましょう。たとえば、10以上の値のみを選んで最大値を求めたい場合、以下のように書けます。
func filterAndProcess(threshold int, values ...int) int {
var filtered []int
for _, value := range values {
if value >= threshold {
filtered = append(filtered, value)
}
}
return max(filtered...)
}
この関数 filterAndProcess
は、まずスライス values
から閾値 threshold
以上の値のみを選択して新たなスライスに格納します。そして、その結果得られたスライスを max
関数の可変引数に展開して渡し、最大値を求めて返します。
実行例
package main
import "fmt"
func max(values ...int) int {
maxVal := values[0]
for _, val := range values[1:] {
if val > maxVal {
maxVal = val
}
}
return maxVal
}
func filterAndProcess(threshold int, values ...int) int {
var filtered []int
for _, value := range values {
if value >= threshold {
filtered = append(filtered, value)
}
}
return max(filtered...)
}
func main() {
values := []int{5, 10, 15, 20, 25, 3, 7}
threshold := 10
result := filterAndProcess(threshold, values...)
fmt.Println(threshold, "より大きな数字", result)
}
この例では、values スライス内の10以上の値 {10, 15, 20, 25} を max 関数に渡しています。filterAndProcess 関数を通じて、max 関数がこのフィルターされたスライスから最大値を計算し、結果として25が出力されます。
下記に試してきます。
https://go.dev/play/p/8y8IfEwOK0M
最後
Go言語における可変引数とスライスの展開は、関数の柔軟性を高める重要な特徴です。この機能を活用することで、コードの再利用性を高め、さまざまなシチュエーションでの関数の適用性を向上させることができます。