我今天遇到了一个问题,并且能够快速找到并修复它,但是并不完全理解为什么golang语义就是这样.
我正在使用Go 1.10.
package main
import "fmt"
type T struct {
V int
}
var testT = T{}
func main() {
t := &(*(&testT))
t.V = 4
fmt.Println(t, testT) // test.V == t.V -> t == &testT
t1 := &testT
t2 := *t1
t3 := &t2
t3.V = 5
fmt.Println(t3, testT) // t3.V == 4 and test.T == 4 -> t3 != &testT
}
Run Code Online (Sandbox Code Playgroud)
&{4} {4}
&{5} {4}
Run Code Online (Sandbox Code Playgroud)
我期望不要等于&testT所以有与t3相同的语义,但是如果我将中间结果存储在变量中,我会看到&(*(&))序列没有相同的语义
这种行为的原因是什么?