メインコンテンツにスキップ
モジュール 3 · レッスン 3 / 5コース内の 13/50~10 min
モジュールのレッスン (3/5)

可変個引数関数

可変引数関数は、任意の数の引数を受け入れます。 同じタイプです。最後の型の前に ... を入れて宣言します。 パラメータ。関数内のパラメータは スライス です。

宣言

Go
func sum(nums ...int) int {
    tot := 0
    for _, n := range nums {
        tot += n
    }
    return tot
}

sum()              // 0   (nums = []int{})
sum(1)             // 1
sum(1, 2, 3, 4)    // 10

last パラメータのみが可変個数にできます。

Go
func log(prefix string, values ...any) { ... }   // ok
// func wrong(...int, suffix string) {}            // ERRORE

スライスを広げる

すでにスライスがある場合は、次のようにして可変引数関数に渡すことができます。 ...:

Go
nums := []int{1, 2, 3}
sum(nums...)         // 6 — espande lo slice nei singoli argomenti

「...」はスライスの後にあります。スプレッドがなければ、タイプが得られます エラー: 関数がシーケンスを予期している場合、[]int を渡すことになります。 int の。

nums は新しいコンテナではなくスライスです

関数 nums の内部には []int 型があります。すべての標準スライス 動作する操作: len(nums)、nums[0]、range など。

古典的な使用例: fmt.Println

fmt の Print* 関数はすべて可変長です。

Go
// signature (semplificata):
// func Println(a ...any) (n int, err error)

fmt.Println("ciao", 42, true)
args := []any{"a", "b", "c"}
fmt.Println(args...)

試してみてください

運動#go.m3.l3.e1
試行回数: 0読み込み中…

すべての引数の合計を返す sum(nums ...int) int を定義します。

エディターを読み込み中…
ヒントを表示

関数 `nums` 内には型 `[]int` があります。

3 回の試行後に解決策が利用可能になります

運動#go.m3.l3.e2
試行回数: 0読み込み中…

スプレッド `nums...` を使用してスライス nums を渡して、既存の sum 関数を呼び出します。

エディターを読み込み中…
ヒントを表示

「...」はスライス名の後に続きます。

3 回の試行後に解決策が利用可能になります

Quiz#go.m3.l3.e3
準備完了

`func f(args ...string)` 内の `args` の型は何ですか?

Go
func f(args ...string) {
    _ = args
}
回答の選択肢

要約

  • ...T を最後のパラメータとして = 可変個引数関数;内部には []T があります。
  • 単一の値で呼び出される: コンパイラはそれらをスライスに収集します。
  • 既存のスライスを使用して呼び出されます: slice... (拡散、スライスを再利用)。
  • すべての fmt.Print* 関数は可変長引数です。
  • 最後のパラメータのみ可変個引数にできます。