1. ホーム
  2. go

[解決済み] ...interface{}の意味 (ドット・ドット・ドット・インターフェース)

2022-12-23 17:16:09

質問

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

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

この3つの点は何なのか、どなたか教えていただけませんか? また ...interface{} は何をするのでしょうか?

どのように解決するのですか?

3つのドット (...) を先頭に持つパラメータタイプは ヴァリアディックパラメータ . つまり、そのパラメータには任意の数または引数を渡すことができます(ちょうど fmt.Printf() ). この関数は、パラメータの引数リストを、パラメータに対して宣言された型のスライスとして受け取ります ( []interface{} のように)。は 囲碁の仕様 という記述があります。

関数シグネチャの最後のパラメータは、...で始まる型を持っている場合があります。このようなパラメータを持つ関数はvariadicと呼ばれ、そのパラメータに対して0個以上の引数で呼び出されることがあります。

パラメータです。

a ...interface{}

である、に相当する機能に対して。

a []interface{}

違いは、このような関数にどのように引数を渡すかです。スライスの各要素を別々に渡すか、ひとつのスライスとして渡すかです。その場合、スライス値のサフィックスに3つのドットを付けなければなりません。以下の例では、同じように呼び出すことになります。

fmt.Println("First", "Second", "Third")

と同じになる。

s := []interface{}{"First", "Second", "Third"}
fmt.Println(s...)

このことは、かなりよく説明されている 囲碁の仕様 にも書かれています。

関数と呼び出しが与えられると

   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 と同じ値をとります。