Arti dari… antarmuka {} (antarmuka titik titik titik)

93

Di bawah ini adalah bagian dari kode Go yang saya pertanyakan. Secara khusus, apa yang ada adi fungsi ini?

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

Adakah yang bisa memberi tahu saya apa tiga titik di sini? Dan apa yang ...interface{}dilakukannya?

BufBills
sumber
33
Dotdotdot disebut Ellipsis.
Erikw

Jawaban:

161

Jenis parameter yang diawali dengan tiga titik (...) disebut parameter variadic . Itu berarti Anda dapat meneruskan angka atau argumen apa pun ke dalam parameter itu (seperti dengan fmt.Printf()). Fungsi tersebut akan menerima daftar argumen untuk parameter sebagai bagian dari tipe yang dideklarasikan untuk parameter ( []interface{}dalam kasus Anda). The Go Keterangan negara:

Parameter terakhir dalam tanda tangan fungsi mungkin memiliki tipe yang diawali dengan .... Fungsi dengan parameter seperti itu disebut variadic dan dapat dipanggil dengan nol atau lebih argumen untuk parameter itu.

Parameter A:

a ...interface{}

Is, untuk fungsi yang setara dengan:

a []interface{}

Perbedaannya adalah bagaimana Anda meneruskan argumen ke fungsi tersebut. Hal ini dilakukan baik dengan memberikan setiap elemen potongan secara terpisah, atau sebagai potongan tunggal, dalam hal ini Anda harus memberikan akhiran nilai potongan dengan tiga titik. Contoh berikut akan menghasilkan panggilan yang sama:

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

Akan melakukan hal yang sama seperti:

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

Ini juga dijelaskan dengan cukup baik di Spesifikasi Go :

Mengingat fungsi dan panggilannya

   func Greeting(prefix string, who ...string)
   Greeting("nobody")
   Greeting("hello:", "Joe", "Anna", "Eileen")

di dalam Greeting, whoakan memiliki nilai nildi panggilan pertama, dan []string{"Joe", "Anna", "Eileen"}di panggilan kedua.

Jika argumen terakhir []Tdapat ditetapkan ke tipe slice , argumen tersebut dapat diteruskan tanpa diubah sebagai nilai untuk ...Tparameter jika argumen diikuti oleh .... Dalam hal ini tidak ada potongan baru yang dibuat.

Mengingat potongan sdan panggilan

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

dalam Greeting, whoakan memiliki nilai yang sama sdengan array dasar yang sama.

ANisus
sumber
10

Sejauh interface{}istilahnya, itu adalah antarmuka kosong. Dengan kata lain, antarmuka diimplementasikan oleh semua variabel di Go.

Ini semacam analogi java.lang.Objectatau System.Objectdalam C #, tetapi malah termasuk setiap jenis variabel dalam bahasa tersebut. Jadi ini memungkinkan Anda meneruskan apa pun ke metode ini.

Dranyar
sumber