Go言語の可変長引数(varargs)の使い方と例を解説!初心者でも安心のステップガイド
生徒
「Go言語で、引数の数が決まっていない関数を作ることってできますか?」
先生
「はい、Go言語では『可変長引数』を使うことで、引数の数がバラバラでも対応できる関数を作ることができますよ。」
生徒
「それって、どんなときに使うと便利なんですか?」
先生
「たとえば、複数の数字をまとめて足し算したいときなどに使うと便利です。では、使い方を順番に見ていきましょう!」
1. 可変長引数とは?
Go言語の可変長引数(varargs)とは、関数の引数として、「いくつ渡してもOKな引数」のことです。1つでも、5つでも、0個でも受け取れる柔軟な仕組みです。
英語では「variable arguments」と呼ばれ、文字通り「数が変わる引数」という意味になります。プログラミングでは、決まった数だけでなく、まとめて処理したい値がいろいろな場面で出てきますよね。
普通の関数は「引数が3つなら、必ず3つ渡す」必要がありますが、可変長引数を使うと「渡したい分だけ渡す」ことができます。つまり、値の数に縛られずに使えるため、使い勝手がとても良いのが特徴です。
例えば、「好きな数字を全部足したい」「名前を何人分でもまとめて表示したい」といった、数がその時によって変わる処理にぴったりです。
実際のイメージを、数字を足し算する簡単な例で見てみましょう。
func sum(nums ...int) {
total := 0
for _, n := range nums {
total += n
}
fmt.Println(total)
}
この関数は、1つだけ渡しても、5つ渡しても、何も渡さなくても動きます。「受け取った数字を順番に足していく」という処理が、渡す数に関係なく成立するからです。
ここで大事なのは、「nums」は1つのまとまりとして扱われ、関数の中ではスライス(配列のような箱)になっているという点です。そのため、後からfor文で順番に取り出せるようになっています。
2. Go言語での可変長引数の基本構文
Go言語で可変長引数を使うときは、...(ドット3つ)を使って定義します。次のように書きます。
func 関数名(引数名 ...型) {
// 処理内容
}
たとえば、整数をいくつでも受け取って合計する関数を定義するには、次のようにします。
func sum(numbers ...int) int {
total := 0
for _, num := range numbers {
total += num
}
return total
}
3. 可変長引数の使い方の実例
それでは、実際にこのsum関数を使ってみましょう。
package main
import "fmt"
func sum(numbers ...int) int {
total := 0
for _, num := range numbers {
total += num
}
return total
}
func main() {
fmt.Println(sum(1, 2, 3)) // 出力: 6
fmt.Println(sum(10, 20, 30, 40)) // 出力: 100
fmt.Println(sum()) // 出力: 0
}
このように、渡す数字の数がバラバラでも関数が正しく動いてくれるのが、可変長引数の強みです。
関数の中では、numbersという名前のスライス(配列のようなもの)として扱われます。だからrange文で順番に取り出せるんです。
4. 可変長引数と普通の引数を組み合わせる
可変長引数は、普通の引数と一緒に使うこともできます。ただし、可変長引数は一番最後に書く必要があります。
func printNames(greeting string, names ...string) {
for _, name := range names {
fmt.Println(greeting, name)
}
}
この関数は、あいさつの言葉(greeting)と、複数の名前(names)を受け取ります。使い方は次の通りです。
func main() {
printNames("こんにちは", "太郎", "花子", "次郎")
}
こんにちは 太郎
こんにちは 花子
こんにちは 次郎
5. スライスを渡すときの注意点
すでにスライス(配列のようなもの)がある場合、それを可変長引数の関数に渡すこともできます。ただし、...をスライスの変数の後ろに付ける必要があります。
func main() {
nums := []int{4, 5, 6}
fmt.Println(sum(nums...)) // sum関数にスライスを渡すときは「...」が必要
}
「...」を付け忘れると、エラーになるので注意しましょう。
6. 可変長引数が使える場面の例え話
可変長引数は、まるで「何人でも来ていいパーティー」のようなものです。普通の関数は「3人までしか入れないレストラン」のように人数が決まっていますが、可変長引数を使えば「何人でもOK!」になります。
プログラミングの世界では、「何個でも受け取れる箱」があるととても便利です。たとえば:
- 何人かの名前を一括で印刷したいとき
- 複数の数字をまとめて計算したいとき
- ログメッセージを何個も表示したいとき
そんなときに、可変長引数が大活躍します。
7. 可変長引数を使うときの注意点
便利な可変長引数ですが、注意するポイントもあります。
- 複数の可変長引数は使えない(1つの関数に1つだけ)
- 位置は必ず最後(普通の引数の後に書く)
- スライスを渡すときは「...」を忘れない
これらを守れば、エラーを防いで安全に使えます。
まとめ
Go言語の可変長引数は、ひとつの関数で引数の数が変わる場面でも柔軟に使える便利な仕組みでした。決まった数だけ受け取る関数とは違い、必要な数だけ値を渡して、そのまま処理できるため、合計計算やメッセージ出力など、日常的なコードでよく役に立ちます。とくに、数字をまとめて足し算したり、名前やログをまとめて表示したりする場面では、同じ関数を何度も書き換える必要がなく、読みやすいプログラムになります。さらに、普通の引数と組み合わせられるところが大きな特徴で、あいさつやラベルなどの固定部分と、自由に増える引数の両方をまとめて使うことで、コード全体がすっきり整理されます。型に合わせてスライスを渡すときには「...」を付ける必要があり、位置は必ず最後に置くという基本的なルールを忘れなければ安心して使えます。可変長引数は配列ではなくスライスとして扱われるため、rangeで並び替えたり、for文で順番に処理したり、既存の仕組みと親和性が高い点も大きな魅力です。書き慣れてくると、「値が増えるときでも関数を変えずに済む」のがとても気持ちよく感じるはずです。いちど知ってしまうと、日常のプログラムのなかで自然に使いたくなる場面が多く、実務でも趣味の開発でも活躍することが多い文法なので、今回の内容を自分のコードに取り入れて、便利さを実感してみてください。
可変長引数を活かしたサンプルコード
最後に、ひとつのラベルと複数のメッセージを整えて表示するサンプルを整理しておきます。プログラムの出力が増える場面でも、同じ構文でひとまとめに処理できる点が分かりやすい例です。
package main
import "fmt"
func logLines(label string, lines ...string) {
for _, line := range lines {
fmt.Println(label, line)
}
}
func main() {
logLines("[INFO]", "起動しました", "通信を開始しました", "処理が完了しました")
logLines("[WARN]")
}
実際に使ってみると、可変長引数の柔軟さがよく分かります。ログの種類が変わっても、メッセージ数が増えても、ひとつの関数でまかなえるため、追加や修正が楽になります。「あとから値が増えるかもしれない」という場面は思ったより多いので、少し意識すると書きやすくなります。
まとめのポイントを整理
- 引数の数が変わる関数を自然に書ける
- 普通の引数と一緒に使える(最後に置く)
- スライスを渡すときは「値...」の形にする
- 関数内ではスライスとして扱われ、rangeやforで処理できる
ほんの少し書き方を工夫するだけで、柔軟な構造を持つプログラムに変わります。同じ処理を何度も書き足す必要がなくなり、読み手にとっても意図が分かりやすいコードになります。
生徒
「可変長引数って、数字を足し算したり名前を並べたり、いろいろ使えそうですね。」
先生
「そうですね。値の数が増える場面はよくあるので、知っておくと便利です。たとえばログを出したいときに、決まった件数だけ出力するとは限りませんよね。」
生徒
「普通の引数と一緒に書けるのも助かります。ラベルだけ固定して、メッセージだけ増やす、みたいな使い方ができました。」
先生
「その通りです。関数をひとつ作れば、メッセージが何件あっても対応できます。可変長引数を使わない場合、同じ処理を何パターンも作る必要が出てしまいます。」
生徒
「スライスを渡すときに『...』が必要なのは、最初はちょっと不思議でした。でも、書き方のルールさえ覚えてしまえば簡単ですね。」
先生
「そうです。値をひとつずつ並べて渡すのも、まとめてスライスで渡すのも、両方できるのが魅力です。使い慣れると、どんな場面で役立つのか感覚が身につきますよ。」
生徒
「次は、可変長引数を組み合わせて簡単なツールを作ってみたいです。ログや統計処理に応用できそうですし。」
先生
「良いですね。引数の数を気にせず関数を呼び出せることが分かれば、作れる幅が広がります。焦らずひとつずつ試してみると、自然と身につきますよ。」