Обучение Golang — как определить, реализован ли интерфейс Golang?

Go

предисловие

При просмотре низкоуровневой библиотеки я увидел странный способ написания, поэтому у меня есть эта статья.

Обсуждаются два основных вопроса:

1. Используйте компиляцию, чтобы определить, реализован ли интерфейс Golang.
2. Разница между make и new extended

текст

1. Используйте new(), чтобы определить, реализован ли интерфейс Golang.

Глядя на библиотеку базового универсального пула ссылок, есть такая строка кода:

var _ Pooler = new(WeightedRoundRobin)

Пояснение: Pooler — это тип интерфейса.

type Pooler interface {
    // ...
}

Я сначала недоумевал, почему я отказался от мелодии после новой?

Позже я узнал, что это было сделано для проверки того, был ли реализован интерфейс?

Прочитав еще немного кода, я обнаружил, что есть много мест, где он написан подобным образом.

До сих пор приехал.

Объяснение: Если вторичный интерфейс не реализован, с одной стороны IDE будет иметь красную горизонтальную черту, а с другой стороны при компиляции появится ошибка. Есть две подсказки, чтобы обеспечить реализацию интерфейса для написания низкоуровневого кода.

2. Разница между make и new extended

Во время обсуждения с друзьями возник такой вопрос: "Вы можете использовать метод go test, чтобы определить интерфейс в файле _test.go для оценки. Приведенное выше суждение будет пустой тратой памяти"

Здесь два момента:
1. Способ пройти тест определенно выполним.
Однако это не гарантирует, что программист действительно не забудет выполнить тест (процесс, который должен пройти). А вот напрямую через наличие, при компиляции будет смещено, это процесс, который должен пройти, поэтому рекомендуется как предыдущий способ.

2. новый занимает память?
new: Память запрашивается, но память не инициализируется, только память обнуляется и возвращается указатель.

make: выделяет память, возвращает нулевое значение инициализированной структуры.
在这里插入图片描述
Вернемся к основному тексту, хотя память и заявлена, она не занимает много памяти, и она будет переработана в gc после инициализации. Так что все в порядке.
В то же время нет проблем с эффективностью, компилируемым языком, знаете ли.

При этом проверьте код нового и разницу между адресом и сделайте:

func main() {
 a1 := new([]int)
 a2:= &[]int{}
 a3:= make([]int,0)

 fmt.Println(a1,a2,a3,a1==a1)
}

приложение:Разница между Golang new и make

расширять
Что касается использования памяти, я сегодня увидел способ записи.

var _ Tester = (*Test)(nil)

Разница между этим и новым заключается в том, что:new проверяется во время компиляции, поэтому запись проверяется во время выполнения

вперед от:Как узнать, реализован ли интерфейс Golang?

В этой статье используетсяmdniceнабор текста