可変長引数

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]