package main
import (
"fmt"
)
func main() {
a := new(struct{})
b := new(struct{})
println(a, b, a==b)
c := new(struct{})
d := new(struct{})
fmt.Println(c, d, c==d)
}
вывод:
0xc000107f37 0xc000107f37 false
&{} &{} true
И после отключения оптимизации компилятора я получу разные результаты.
0xc000087e4e 0xc000087e4e true
&{} &{} true
Почему компилятор Go выполняет эту оптимизацию?
См. [Эту строку в исходном коде среды выполнения]
(https://github.com/golang/go/blob/6317adeed7815ad335e2e97c463a7c3c4d82fc19/src/runtime/malloc.go#L586)
if size == 0 {
return unsafe.Pointer(&zerobase)
}
Я думаю, что поскольку все переменные нулевого размера будет выделен с нулевой базой, он должен печатать true вместо false.