Объявление интерфейсов в GoLang с символом массива - PullRequest
0 голосов
/ 23 февраля 2019

Я видел интерфейсы, определенные как:

type MyInterface interface{
   Method()
}

и

type MyInterface []interface{
   Method()
}

В чем разница в этих двух определениях?

Ответы [ 3 ]

0 голосов
/ 23 февраля 2019

В основном, когда вы создаете

type Iface interface {
    Age() uint
    Name() string
}

type SliceIface []interface {
    Age() uint
    Name() string
}

// then SliceIface and []Iface has the same behaviour

, чтобы вы могли сказать

type SliceIface []Iface

Посмотрите на следующий код

https://play.golang.org/p/DaujSDZ8p-N

0 голосов
/ 24 февраля 2019

Первое - это объявление интерфейса с объявленным в нем методом method().

type MyInterface interface{
   Method()
}

Второе - переменная с типом [] interface {} не является интерфейсом!Это фрагмент, тип элемента которого является интерфейсом {}

type MyInterface []interface{
   Method()
}

Плюс, переменная с типом [] interface {} имеет определенный макет памяти, известный во время компиляции.

0 голосов
/ 23 февраля 2019

Первый определяет interface методом Method(), а второй определяет slice interface.Оператор использует форму литерала типа и может быть интерпретирован как:

type MyInterface [](interface{
   Method()
})

Где interface{...} здесь - литерал типа .Который имеет тот же эффект

type I = interface{
   Method()
}
type MyInterface []I

Подробнее о литерале типа : https://golang.org/ref/spec#Types

Примечание: MyInterface было бы очень плохим именем во второмодин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...