回答:
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
、同じ基本配列と同じ値になります。