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]