r, s := new(struct{}), new(struct{})
fmt.Println(*r == *s, r == s) //true false
}
___________________
var (
r, s = new(struct{}), new(struct{})
)
func main() {
fmt.Println(*r == *s, r == s) //true true
}
потому что вы либо сравниваете пустую структуру, которая является Unit-значением, то есть имеет только одно значение, а значит всегда равно самому себе либо сравниваете указатели, которые могут иметь разные значения
Вы не поняли вопроса, тут различие лишь в объявлении переменной которая создает указатели на структуру но почему же при такой вроде как очевидной проверке ответы различаются
Он там сравнивает два указателя на структуры. Они равны. Это оптимизация? Как с интами?
Гошечка не перестает удивлять)
пустая структура это отдельная фича
Потому что вы из создаёте по разному и в памяти они по разному легли, структура всегда в куче будет, отсюда *r == *s в обоих случаях, но вот пойнтеры во втором случае похоже создался как и структура, с расчетом хеша и устранением задвоения объектов в памяти, а в первом пойнтеры похоже в стеке создались и их реально два. Если не попутал ничего то как то оно так. Особенность работы го с памятью в попытке не дублировать одинаковые объекты
Мне кажется так же было бы с любыми одинаковыми структурами только для пустой структура созданная с нью и без нью это один объект, а для не пустой может и разные, это я в отладчике не смотрел
ну проверить ничто не мешает, нл мне кажется что любая структура кроме пустой будет вести себя как инт
Почему она будет как инт? В смысле? По-моему структуры слаксы и дикты они в куче в любом случае, а голый инт объявленный в функции в стеке создастся
ещё раз, пустая структура это особый случай
А непустая в чем будет себя вести как ин-т?
там пример выше был. для пустых структур и для интов
Обсуждают сегодня