Почему меняется указатель?
По умолчанию, переменная val располагается на стеке, но при использовании fmt.Println() переменная "убегает" в heap.
Так как параметры в функцию передаются через стек, из за этого сдвигается указатель на переменную.
Это хорошо видно, если открыть дебагер и посмотреть изменение регистров.
Запустить escape analysis можно с помощью команды:
go run -gcflags "-m" test.go $ go run -gcflags "-m" test.go 
# command-line-arguments
./test.go:13:13: inlining call to fmt.Println
./test.go:9:6: moved to heap: val
./test.go:13:14: &val escapes to heap
./test.go:13:13: main []interface {} literal does not escape
./test.go:13:13: io.Writer(os.Stdout) escapes to heap
<autogenerated>:1: (*File).close .this does not escape
0xc00001a0a8
0xc00001a0a8
0xc00001a0a8
По умолчанию, переменная val располагается на стеке, но при использовании fmt.Println() переменная "убегает" в heap.
Так как параметры в функцию передаются через стек, из за этого сдвигается указатель на переменную.
Это хорошо видно, если открыть дебагер и посмотреть изменение регистров.
Запустить escape analysis можно с помощью команды:
go run -gcflags "-m" test.go $ go run -gcflags "-m" test.go 
# command-line-arguments
./test.go:13:13: inlining call to fmt.Println
./test.go:9:6: moved to heap: val
./test.go:13:14: &val escapes to heap
./test.go:13:13: main []interface {} literal does not escape
./test.go:13:13: io.Writer(os.Stdout) escapes to heap
<autogenerated>:1: (*File).close .this does not escape
0xc00001a0a8
0xc00001a0a8
0xc00001a0a8