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 関数名(引数名 ...型) {
// 処理内容
}
この書き方を使うと、関数に渡された値が「まとめて1つのスライス」として扱われます。つまり、後からループで取り出すことができ、個数がバラバラでも同じ処理ができる仕組みになっています。
たとえば、複数の数字を足し算する簡単な関数は次のように書けます。
func sum(numbers ...int) int {
total := 0
for _, num := range numbers {
total += num
}
return total
}
この関数は「1個だけ数字を渡す」「5個の数字を渡す」「何も渡さない」など、どんな場合でも正しく動きます。受け取った値がnumbersというスライスにまとまるため、同じ処理をシンプルに書ける点が大きなメリットです。
もし通常の関数で同じことをしようとすると「引数が3つある場合」「5つある場合」といったように、複数の関数を作る必要があります。しかし可変長引数なら、ひとつの関数だけで対応でき、コードがすっきりまとまります。これが可変長引数がよく使われる理由です。
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で処理できる
ほんの少し書き方を工夫するだけで、柔軟な構造を持つプログラムに変わります。同じ処理を何度も書き足す必要がなくなり、読み手にとっても意図が分かりやすいコードになります。
生徒
「可変長引数って、数字を足し算したり名前を並べたり、いろいろ使えそうですね。」
先生
「そうですね。値の数が増える場面はよくあるので、知っておくと便利です。たとえばログを出したいときに、決まった件数だけ出力するとは限りませんよね。」
生徒
「普通の引数と一緒に書けるのも助かります。ラベルだけ固定して、メッセージだけ増やす、みたいな使い方ができました。」
先生
「その通りです。関数をひとつ作れば、メッセージが何件あっても対応できます。可変長引数を使わない場合、同じ処理を何パターンも作る必要が出てしまいます。」
生徒
「スライスを渡すときに『...』が必要なのは、最初はちょっと不思議でした。でも、書き方のルールさえ覚えてしまえば簡単ですね。」
先生
「そうです。値をひとつずつ並べて渡すのも、まとめてスライスで渡すのも、両方できるのが魅力です。使い慣れると、どんな場面で役立つのか感覚が身につきますよ。」
生徒
「次は、可変長引数を組み合わせて簡単なツールを作ってみたいです。ログや統計処理に応用できそうですし。」
先生
「良いですね。引数の数を気にせず関数を呼び出せることが分かれば、作れる幅が広がります。焦らずひとつずつ試してみると、自然と身につきますよ。」
この記事を読んだ人からの質問
プログラミング初心者からのよくある疑問/質問を解決します
Go言語の可変長引数とは何ですか?普通の引数とどう違うのですか?
Go言語の可変長引数とは、引数の数を自由に増やしたり減らしたりできる便利な仕組みです。普通の引数は数が決まっていますが、可変長引数では、いくつ渡してもよいという特徴があります。可変長引数はスライスのように扱われるため、受け取った複数の値を順番に処理することができ、数字の足し算やログのまとめ出力など、さまざまな場面で活躍します。Go言語の関数で複数の値を柔軟に扱えるため、プログラミング初心者でもとても使いやすい機能です。SEO対策の面でも、「Go言語 可変長引数 意味 違い 初心者」などのキーワードで検索する人が多いため、理解しておくと役立ちます。
【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導
「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。
本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。
具体的な開発内容と環境
【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。
【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。
この60分で得られる3つの理解
「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。
データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。
ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。
※本講座は、将来的にバックエンドエンジニアやクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。
初めてのGo言語を一緒に学びましょう!