可変長引数

Go言語における**可変長引数(variadic parameters)**は、関数が「引数の数が決まっていない」状況でも柔軟に対応できるようにする仕組みです。これは、関数に複数の同じ型の引数を渡すときに非常に便利です。


基本構文

可変長引数を使うには、関数定義の中で引数の型の前に ...(三点リーダ)を付けます。

go
func 関数名(引数名 ...型) { // 関数の本体 }

例:整数の合計を求める関数

go
func sum(nums ...int) int { total := 0 for _, num := range nums { total += num } return total } func main() { fmt.Println(sum(1, 2, 3)) // 出力: 6 fmt.Println(sum(10, 20, 30, 40)) // 出力: 100 }

このように、sum 関数には任意の個数の int 型の引数を渡すことができます。


実体はスライスとして扱われる

関数の中では、可変長引数は**スライス(slice)**として扱われます。たとえば、nums ...int は関数内部では []int として参照できます。


可変長引数と他の引数の併用

可変長引数は、他の通常の引数と一緒に使うこともできます。ただし、可変長引数は必ず引数リストの最後に置く必要があります

go
func greet(prefix string, names ...string) { for _, name := range names { fmt.Println(prefix, name) } } func main() { greet("Hello", "Alice", "Bob", "Charlie") }

出力:

nginx
Hello Alice Hello Bob Hello Charlie

スライスを渡す場合の展開

可変長引数を受け取る関数にスライスを渡すには、スライスの後に ... を付けて「展開」する必要があります。

go
func main() { numbers := []int{5, 10, 15} fmt.Println(sum(numbers...)) // スライスを展開して渡す }

注意点

  • 可変長引数はゼロ個でも受け取ることができます。したがって、空の状態で呼び出してもエラーになりません。

  • 関数が複数の可変長引数を持つことはできません。常に1つだけです。


まとめ

特徴 説明
構文 func f(x ...int) のように書く
実体 関数内ではスライスとして扱われる
制限 可変長引数は最後に1つだけ指定できる
応用 スライスの展開には ... が必要

Go言語で可変長引数を使うことで、関数の柔軟性が高まり、さまざまなデータに対応した汎用的な関数を作ることができます。

生成日:2025/05/03