… Arabiriminin anlamı {} (nokta nokta nokta arabirimi)


95

Aşağıda, hakkında sorum olan bir Go kodu var. Spesifik olarak, abu işlevde neler var ?

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

Biri bana buradaki üç noktanın ne olduğunu söyleyebilir mi? Ve ne yapar ...interface{}?


33
Dotdotdot, Ellipsis olarak adlandırılır.
Erikw

Yanıtlar:


165

Üç nokta (...) ile başlayan bir parametre türü, değişken parametre olarak adlandırılır . Bu, bu parametreye herhangi bir sayı veya argüman geçirebileceğiniz anlamına gelir (tıpkı ile olduğu gibi fmt.Printf()). İşlev, parametrenin bağımsız değişkenlerinin listesini, parametre için bildirilen türün bir dilimi olarak alır ( []interface{}sizin durumunuzda). Git Şartname devletler:

Bir fonksiyon imzasındaki son parametrenin ön ekli bir tipi olabilir. Böyle bir parametreye sahip bir fonksiyona variadic adı verilir ve bu parametre için sıfır veya daha fazla argümanla çağrılabilir.

Bir parametre:

a ...interface{}

Eşdeğer işlev için:

a []interface{}

Aradaki fark, argümanları böyle bir işleve nasıl ilettiğinizdir. Dilimin her bir öğesini ayrı ayrı vererek veya tek bir dilim olarak yapılır, bu durumda dilim değerinin sonuna üç nokta eklemeniz gerekir. Aşağıdaki örnekler aynı çağrı ile sonuçlanacaktır:

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

Aynı şeyi yapacak:

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

Bu, Go Spesifikasyonunda da oldukça iyi açıklanmıştır :

İşlev ve çağrılar göz önüne alındığında

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

içinde Greeting, ilk çağrıda ve ikinci çağrıda whodeğere sahip olacaktır .nil[]string{"Joe", "Anna", "Eileen"}

Son bağımsız değişken bir dilim türüne atanabilirse , bağımsız değişkenin ardından []Tbir ...Tparametre değeri olarak değiştirilmeden geçirilebilir .... Bu durumda yeni dilim oluşturulmaz.

Dilim verildi sve çağrı

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

içinde Greeting, aynı temel dizi ile whoaynı değere sahip olacaktır s.


10

interface{}Terim kadarıyla boş arayüz. Başka bir deyişle, Go'daki tüm değişkenler tarafından uygulanan arayüz.

Bu, C # java.lang.Objectveya System.ObjectC # ile benzerdir , ancak bunun yerine dildeki her değişken türünü içerir. Böylece yönteme herhangi bir şey aktarmanıza izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.