предисловие
При просмотре низкоуровневой библиотеки я увидел странный способ написания, поэтому у меня есть эта статья.
Обсуждаются два основных вопроса:
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набор текста