0Pricing
Go Academy · レッスン

可変長引数関数

可変個数の引数を受け取る方法

「可変長引数関数」は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)     // 15

fmt.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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 関数の基本とシグネチャ
  2. 複数の戻り値
  3. 可変長引数関数
  4. defer、無名関数、クロージャ
← Go Academyに戻る