…インターフェース{}(ドットドットドットインターフェース)の意味


92

以下は、私が質問しているGoコードの一部です。具体的にはa、この関数には何がありますか?

func DPrintf(format string, a ...interface{}) (n int, err error) {
  if Debug > 0 {
    n, err = fmt.Printf(format, a...)
  }
  return
}

ここにある3つのドットは何か教えてもらえますか?そして、何をし...interface{}ますか?


31
dotdotdotは省略記号と呼ばれます。
エリックウェストラップ2014年

回答:


160

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")

Greetingwho値を持つことになりますnil最初の呼び出しで、そして[]string{"Joe", "Anna", "Eileen"}第二インチ

最後の引数がスライス型に割り当て可能な場合、引数の後にが続く場合、パラメータ[]Tの値としてそのまま渡さ...T...ます。この場合、新しいスライスは作成されません。

スライスsと呼び出しを考える

   s := []string{"James", "Jasmine"}
   Greeting("goodbye:", s...)

Greetingwhos、同じ基本配列と同じ値になります。


10

限りinterface{}用語、それは空のインタフェースがあります。つまり、Goのすべての変数によって実装されるインターフェースです。

これは、ソートに類似のですjava.lang.ObjectSystem.ObjectC#ではなく、言語内のすべての変数の型の代わりに、包括的です。そのため、メソッドに何でも渡すことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.