
Go言語では関数の引数を制限なく渡せる方法があるって聞いたんですが…本当ですか?
Go言語では、関数の引数を制限なく受け取ることができる可変長引数というものがあります。
今回は、可変長引数を理解する前にGo言語の関数の基本も少しだけ復習しながら進めていきます。

関数の復習がいらない方はここからジャンプ!
Go言語の関数にちょっと不安がある方は、当ブログの記事を参考にしましょう。
Go言語の可変長引数を実際に使ってみよう!
Go言語の可変長引数を関数に使用して使って、実際の動きを確認してみましょう。
その前に基本的な関数を復習しましょう
Go言語の可変長引数を使用して関数を作成する前に、基本的な関数を復習していきます。

簡単に足し算のプログラムを作ってみましょう!
// 基本的な関数の復習
package main
import "fmt"
func add(num1, num2 int) int {
return num1 + num2
}
func main() {
n := add(1, 2)
fmt.Println(n)
}
// 出力結果
$ go run main.go
3
引数を2つ渡して足し算した関数で問題なく動いています。
もし引数を3つ渡したら、もちろんエラーになります。
// 出力結果
$ go run main.go
# command-line-arguments
./main.go:30:10: too many arguments in call to add
have (number, number, number)
want (int, int)

エラーメッセージが実にわかりやすいですね。
さらに、引数を何も渡さなかったら…
// 出力結果
$ go run main.go
# command-line-arguments
./main.go:30:10: not enough arguments in call to add
have ()
want (int, int)
もちろん同じようなエラーが出力されます。
ここまでを踏まえた上で、関数の引数に可変長引数を使ってみましょう。
関数の引数に可変長引数を使う
可変長引数の使用は下記の構成になります。
// 可変長引数
func 関数名(引数 ...型) {
// 処理する内容
}
引数の型指定の前に ...
を付け加えることで可変長引数になります。
では、実際にプログラムで動きを確認しましょう。
// 可変長引数
// 引数の数を指定しなくても関数に渡すことができる
package main
import "fmt"
func v(params ...int) {
fmt.Println("要素数は", len(params), "受け取った値", params)
}
func main() {
// 関数の実行
v(1, 2, 3)
v(1, 2, 3, 4, 5)
v()
}
// 出力結果
要素数は 3 受け取った値 [1 2 3]
要素数は 5 受け取った値 [1 2 3 4 5]
要素数は 0 受け取った値 []
受け取った値は配列に収められています。
そして、引数が空でもエラーにならずに出力されていることが確認できます。
関数の引数としてスライスを渡す
関数の引数にスライスを渡してみましょう。
実際にプログラムで確認します。
// 可変長引数
// 関数の引数としてスライスを渡す
package main
import "fmt"
func v1(params ...string) {
fmt.Println("要素数は", len(params), "受け取った値", params)
}
func main() {
// スライスを作成しても渡せる
sl := []string{"Golang", "PHP", "Python"}
//ここ注意!スライス名のあとに ... を付ける
v1(sl...)
}
// 出力結果
要素数は 3 受け取った値 [Golang PHP Python]
スライスも引数として渡すことができました。
スライスを渡す時は引数に スライス名...
となります。
【参考】実は可変長引数を普段から使用していたんです…

可変長引数は普段から使用していたんです。
例えば fmt.Println()
関数は、可変長引数なんです。
// fmt.Println() もカンマ区切りで引数をいくらでも渡せます
fmt.Println("Hello", "World", "!", "moripです。")
fmt.Println()
関数の引数も , 区切りでいくらでも記述でき、引数をきちんと出力してくれます。
Go言語の雑学程度に覚えておきましょう。
【まとめ】Go言語の可変長引数について
今回はGo言語の可変長引数についてお伝えしてきました。
それでは、まとめに入りましょう。
関数の引数として可変長引数を扱う時の構成
// 可変長引数
func 関数名(引数 ...型) {
// 処理する内容
}
可変長引数自体は使用頻度は少ないと思います。
ただ、これから他の人のコードを見る際には覚えておかなければいけないでしょう。
...
を見たら、可変長引数だな。
と理解しておきましょうね。
comment