Go の関数は可変長引数をサポートしている。可変長引数は引数リストの最後にだけ置くとこができ、args ...int
のように書く。こうすると、args
には引数がスライスとして格納される。
func foo1(a int, args ...int) {
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)
}
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)
}
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)
}
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]