一個(gè)容易讓 gopher 理解不當(dāng)?shù)男〖?xì)節(jié)

1type?S?string???
2p?:=?&S{"test"}
S 對(duì)象是 string 的別名,它是不可尋址的,編譯器會(huì)返回 cannot take the address of S("test") 的錯(cuò)誤。因此,將例子改為如下所示。1????type?S?struct?{
2????????s?string
3????}
4????p?:=?&S{"test"}
5????c?:=?p
6????p?=?nil
7????fmt.Println(p,?c)
1<nil>?&{test}
p ,c 卻沒(méi)有變化?問(wèn)題討論
1????type?S?struct?{
2????????s?string
3????}
4????p?:=?&S{"test"}
5????c?:=?p
6????fmt.Printf("p指向的地址:%p c指向的地址:%p\n",?p,?c)
7????fmt.Printf("p本身的地址:%p c本身的地址:%p\n",?&p,?&c)
8????p?=?nil
9????fmt.Println(p,?c)
1p指向的地址:0xc00008e1e0?c指向的地址:0xc00008e1e0
2p本身的地址:0xc0000ae018?c本身的地址:0xc0000ae020
3<nil>?&{test}

p 和 c 都是指向同一塊內(nèi)存的 S 類(lèi)型指針對(duì)象,p = nil 的操作,不是修改它指向地址中的內(nèi)容,而是修改它的指向,因此 p 的指向變化,不會(huì)對(duì) c 造成任何影響。p = nil 修改為 p.s = "sss" ,即代碼如下1????type?S?struct?{
2????????s?string
3????}
4????p?:=?&S{"test"}
5????c?:=?p
6????p.s?=?"sss"
7????fmt.Println(p,?c)
1&{sss}?&{sss}

p 對(duì)指向地址的內(nèi)容做了修改,此修改同時(shí)影響到了 c 。總結(jié)
p 和 c 都是 S 類(lèi)型的指針對(duì)象,它們對(duì)同一個(gè)指向內(nèi)容的修改會(huì)相互影響。但是,如果是它們的指向發(fā)生變化,那么 p 與 c 將不再存在任何關(guān)系,它們的內(nèi)容修改將不再相互影響。所以,如果將上文中 ?p = nil 修改為 p = &S{"sss"},它同樣不會(huì)對(duì) c 造成任何影響。推薦閱讀
評(píng)論
圖片
表情
