func main() { var s = Stu{ name: "法外狂徒", } s.name = "法内狂徒" (&s).name = "守法公民张三" fmt.Printf("%#v", s) }
result:
------------------------------------------
main.Stu{name:"守法公民张三"}
Process finished with exit code 0
------------------------------------------
Go中结构体是值类型,值类型直接指向内容,所以可用s直接修改它内部变量值。
那&s呢?个人理解为就是取s结构体的地址,但是s的地址本身就指向内容,所以这里是等效的。
实际上变量本身就是一种特殊的指针,但是类型固定能直接使用赋值(静态语言,动态语言如Python则不然),不需要加上*(析址符)
上面如果写成:
(*s).name = "守法公民张三" // error:Invalid indirect of ‘s‘ (type ‘Stu‘)
变量的地址可以取,但是反之则不然,不能把一般的变量当成地址来取该地址里的东西,如果可以,那么是指针
原文:https://www.cnblogs.com/CodeBeyond/p/13056701.html