Go の関数は可変長引数をサポートしている。可変長引数は引数リストの最後にだけ置くとこができ、args ...int
のように書く。こうすると、args
には引数がスライスとして格納される。
package main import "fmt" func foo0(args ...int) { fmt.Println(args) } func foo1(a int, args ...int) { fmt.Println(a, args) } func main() { foo0() foo0(1) foo0(1, 2) foo0(1, 2, 3) foo1(1) foo1(1, 2) foo1(1, 2, 3) foo1(1, 2, 3, 4) }
foo0
は1つの可変長引数、言い換えると 0 個以上の引数をとり、foo1
は1つ以上の引数をとる。
^o^ > go run variable_length.go [] [1] [1 2] [1 2 3] 1 [] 1 [2] 1 [2 3] 1 [2 3 4]
スライスに要素を追加する関数 append も、実は可変長引数だ。このとおり。
package main import "fmt" func main() { a := []int{ 1,2,3 } fmt.Println(a) a = append(a, 4, 5, 6) fmt.Println(a) }
^o^ > go run append.go [1 2 3] [1 2 3 4 5 6]
可変長引数に渡すデータがスライスの時、s...
のように書くと、スライスを展開して可変長引数に渡すことができる。これを利用して、スライスの連結ができる。
package main import "fmt" func main() { a := []int{ 1,2,3 } b := []int{ 4,5,6 } fmt.Println(a) fmt.Println(b) c := append(a, b...) fmt.Println(c) }
^o^ > go run append2.go [1 2 3] [4 5 6] [1 2 3 4 5 6]