Значення… інтерфейс {} (крапка крапка крапка інтерфейс)


93

Нижче - частина коду Go, про яку я маю запитання. Зокрема, що aв цій функції?

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

Хтось може сказати мені, які тут три крапки? А що робить ...interface{}?


33
Точковий пункт називається Еліпсис.
Ерік

Відповіді:


161

Тип параметра з префіксом із трьох крапок (...) називається варіадичним параметром . Це означає, що ви можете передавати будь-яке число або аргументи в цей параметр (як і в fmt.Printf()). Функція отримає список аргументів для параметра у вигляді зрізу типу, оголошеного для параметра ( []interface{}у вашому випадку). У специфікації Go зазначено:

Кінцевий параметр у підписі функції може мати тип із префіксом .... Функція з таким параметром називається варіадичною і може бути викликана нулем або більше аргументів для цього параметра.

Параметр:

a ...interface{}

Є для функції, еквівалентної:

a []interface{}

Різниця полягає в тому, як ви передаєте аргументи такій функції. Це робиться або шляхом надання кожного елемента зрізу окремо, або у вигляді одного зрізу, і в цьому випадку вам доведеться суфіксувати значення зрізу трьома крапками. Наступні приклади призведуть до того самого виклику:

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з тим самим базовим масивом.


10

Що стосується interface{} терміна, то це порожній інтерфейс. Іншими словами, інтерфейс, реалізований усіма змінними в Go.

Це аналогічно java.lang.Objectабо System.Objectв C #, але натомість включає всі типи змінних у мові. Таким чином, це дозволяє передати будь-що до методу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.