<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1465字,需瀏覽 3分鐘

           ·

          2021-02-05 09:32

          周末,一位熱情好學(xué)的讀者給我發(fā)了條私信,聊天內(nèi)容如下圖所示。小菜刀猜測(cè)可能會(huì)有一部分讀者也存在跟他一樣的疑惑,所以特此簡(jiǎn)單地探討一下該問(wèn)題。

          首先需要糾正一點(diǎn)的是,他給出的代碼是不能通過(guò)編譯的。
          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)
          輸出結(jié)果
          1<nil>?&{test}
          其實(shí),讀者的疑問(wèn)就在于:為什么修改 p ,c 卻沒(méi)有變化?

          問(wèn)題討論

          為了回答這個(gè)疑問(wèn),我們?cè)诖a中增加了幾處詳細(xì)打印如下
          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)
          輸出結(jié)果
          1p指向的地址:0xc00008e1e0?c指向的地址:0xc00008e1e0
          2p本身的地址:0xc0000ae018?c本身的地址:0xc0000ae020
          3<nil>?&{test}
          該過(guò)程圖解如下

          pc 都是指向同一塊內(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)
          此時(shí)的結(jié)果
          1&{sss}?&{sss}
          該過(guò)程圖解如下

          此時(shí),p 對(duì)指向地址的內(nèi)容做了修改,此修改同時(shí)影響到了 c 。

          總結(jié)

          以本文中的例子簡(jiǎn)單總結(jié)一下:pc 都是 S 類(lèi)型的指針對(duì)象,它們對(duì)同一個(gè)指向內(nèi)容的修改會(huì)相互影響。但是,如果是它們的指向發(fā)生變化,那么 pc 將不再存在任何關(guān)系,它們的內(nèi)容修改將不再相互影響。所以,如果將上文中 ?p = nil 修改為 p = &S{"sss"},它同樣不會(huì)對(duì) c 造成任何影響。
          因此,對(duì)于指針類(lèi)型對(duì)象,我們要注意區(qū)分的就是修改操作到底是修改指向地址的內(nèi)容還是修改指針的指向。能夠分清這個(gè),那么本文的問(wèn)題也就不再對(duì)你造成威脅了。

          推薦閱讀


          福利

          我為大家整理了一份從入門(mén)到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門(mén)看什么,進(jìn)階看什么。關(guān)注公眾號(hào) 「polarisxu」,回復(fù)?ebook?獲?。贿€可以回復(fù)「進(jìn)群」,和數(shù)萬(wàn) Gopher 交流學(xué)習(xí)。

          瀏覽 20
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  先锋成人视频 | 操逼逼123 | 狠狠干五月天 | 久久久成人无码网站 | 国产精品五月天久久久 |