可変長引数関数
可変個数の引数を受け取る方法
「可変長引数関数」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
可変長引数関数とは
可変長引数関数は、指定した型の引数を0個以上受け取り、それらをスライスにまとめます。
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
fmt.Println(sum(1, 2, 3, 4)) // 10...T 構文
最後のパラメーターの型として ...T を使用します。関数の内部では、これは []T になります。
- 0個以上の引数で呼び出せます
- 可変長引数パラメーターは最後でなければなりません
- 1つの関数につき、可変長引数パラメーターは1つだけ使用できます
スライスの展開
展開演算子 ... を使用すると、既存のスライスを可変長引数関数に渡せます。
nums := []int{1, 2, 3, 4, 5}
total := sum(nums...) // spread the slice
fmt.Println(total) // 15fmt.Println は可変長引数関数
標準ライブラリの関数の多くは可変長引数関数です。fmt.Println のシグネチャは func Println(a ...interface{}) (n int, err error) で、任意の型の値を任意の個数受け取れます。
append は可変長引数関数
組み込みの append は可変長引数関数です。
a := []int{1, 2, 3}
b := []int{4, 5, 6}
a = append(a, b...) // append all of b into a
fmt.Println(a) // [1 2 3 4 5 6]他のパラメーターとの可変長引数
可変長引数パラメーターは最後に置きます。固定長のパラメーターと組み合わせることもできます。
func logf(level string, msg string, args ...interface{}) {
fmt.Printf("[%s] "+msg+"\n", append([]interface{}{level}, args...)...)
}引数なしの可変長引数呼び出し
可変長引数関数は引数なしでも呼び出せます。この場合、スライスは nil(または空)になります。
fmt.Println(sum()) // 0 — nil slice, loop runs 0 times可変長引数とスライスパラメーター
可変長引数とスライスパラメーターは、次のように使い分けます。
- 可変長引数:呼び出し側が個々の値をインラインで渡す場合(例:
sum(1,2,3)) - スライス:呼び出し側が常に作成済みのコレクションを持っている場合
- 可変長引数は呼び出し側でより扱いやすくなりますが、関数内部ではどちらも同じように機能します
可変長引数を別の可変長引数関数に渡す
展開を使用して可変長引数を別の関数に転送します。
func logError(args ...interface{}) {
log.Println(args...) // forward to log.Println
}オプションパターンの構築
可変長引数の ...Option は、オプションの設定(functional options)でよく使われるパターンです。
type Option func(*Server)
func NewServer(addr string, opts ...Option) *Server {
s := &Server{addr: addr}
for _, o := range opts {
o(s)
}
return s
}簡単な確認
スライスを可変長引数関数に渡すには、どうすればよいですか。
まとめ:可変長引数関数
可変長引数関数を使うと、呼び出し側のコードをすっきりさせられます。
...Tは末尾の引数を関数内部で[]Tにまとめます- 個々の値を渡すか、
slice...でスライスを展開して呼び出せます appendやfmt.Printlnなどの組み込み関数は可変長引数関数です- 使用できる可変長引数パラメーターは1つだけで、最後に置く必要があります
- 表現力の高い API 設計には functional options パターンを使用してください
次は、defer、無名関数、クロージャです。
よくある質問
「可変長引数関数」レッスンは無料ですか?
はい。「可変長引数関数」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「可変長引数関数」で何を学びますか?
可変個数の引数を受け取る方法 ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「可変長引数関数」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。