回答:
3つのドット(...)が前に付いているパラメーター・タイプは、可変パラメーターと呼ばれます。つまり、任意の数または引数をそのパラメータに渡すことができます(と同様にfmt.Printf())。関数は、パラメーターの引数のリストを、パラメーターに対して宣言されたタイプのスライスとして受け取ります([]interface{}あなたの場合)。ゴー仕様状態:
関数シグネチャの最後のパラメータは、型が...で始まる場合があります。このようなパラメータを持つ関数は、可変個引数と呼ばれ、そのパラメータの0個以上の引数で呼び出すことができます。
パラメータ:
a ...interface{}
は、以下と同等の関数です。
a []interface{}
違いは、そのような関数に引数を渡す方法です。スライスの各要素を個別に指定するか、単一のスライスとして指定します。この場合、スライスの値に3つのドットを付ける必要があります。次の例では、同じ呼び出しになります。
fmt.Println("First", "Second", "Third")
同じことを行います:
s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)
これは、Go仕様でも十分に説明されています。
関数と呼び出しを考える
func Greeting(prefix string, who ...string) Greeting("nobody") Greeting("hello:", "Joe", "Anna", "Eileen")内
Greeting、who値を持つことになりますnil最初の呼び出しで、そして[]string{"Joe", "Anna", "Eileen"}第二インチ最後の引数がスライス型に割り当て可能な場合、引数の後にが続く場合、パラメータ
[]Tの値としてそのまま渡さ...Tれ...ます。この場合、新しいスライスは作成されません。スライス
sと呼び出しを考えるs := []string{"James", "Jasmine"} Greeting("goodbye:", s...)内
Greetingでwhoはs、同じ基本配列と同じ値になります。