<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>

          一篇文章帶你了解Go語言基礎(chǔ)之指針

          共 2206字,需瀏覽 5分鐘

           ·

          2022-03-04 18:42

          點(diǎn)擊上方“Go語言進(jìn)階學(xué)習(xí)”,進(jìn)行關(guān)注

          回復(fù)“Go語言”即可獲贈Python從入門到進(jìn)階共10本電子書

          子胥既棄吳江上,屈原終投湘水濱。

          前言

          Hey,大家好呀,我是星期八

          作為21世紀(jì)的C語言,Go可能多方面思考,最終還是保留了指針。

          但是要比C語言指針簡單很多,一起來看看叭。


          引言

          因?yàn)镚o語言是類C語言,所以為了提高效率,仍然保留了指針。

          但是如果沒有接觸過指針,可能學(xué)起來指針需要多多思考一下了。

          指針通常情況下,也被稱為小白勸退神奇。


          基本類型指針的理解

          先看這兩行代碼。

          var n1 int = 666fmt.Println(n1)//結(jié)果:666fmt.Printf("%p\n",n1)//結(jié)果:%!p(int=666),說明不是一個地址,就是一個值

          內(nèi)存分布圖如下。

          再看看這樣兩行代碼,這里用到了&

          var n1 int = 1//表示取n1的地址fmt.Println(&n1)//結(jié)果:0xc00000a0b8fmt.Printf("%p\n",&n1)//結(jié)果:0xc00000a0b8

          如圖所示。

          如果這兩個能理解,恭喜你,指針已經(jīng)會了一半了。


          引用類型指針的理解

          先看這樣的代碼。

          var studentList = []string{"張三""李四"}//一個切片fmt.Println(studentList)        //結(jié)果:[張三 李四]fmt.Printf("%p\n", studentList) //結(jié)果:0xc0000044a0//去地址fmt.Printf("%p\n", &studentList) //結(jié)果:0xc0000044a0

          內(nèi)存分布圖如下。


          值類型和引用類型

          值類型

          在Go中,值類型主要有。

          intfloatboolstring數(shù)組struct(結(jié)構(gòu)體)

          內(nèi)存分布大致如下。

          注:字符串數(shù)組結(jié)構(gòu)體這些屬于連續(xù)存儲變量指向的是它們的第一個地址,剩下的會根據(jù)長度計(jì)算。

          引用類型

          在Go中,引用類型主要有。

          切片(slice)map管道(chan)

          內(nèi)存分布大致如下。


          棧內(nèi)存和堆內(nèi)存的區(qū)別

          棧內(nèi)存在存儲上,只能存一些簡單的東西,比如數(shù)字了字符了浮點(diǎn)數(shù)了之類的,但是棧內(nèi)存分配的內(nèi)存程序員不用回收,由系統(tǒng)自己回收,并且性能很高。

          堆內(nèi)存在存儲上就比較豐富了,隨便存,像map,隨便塞,但是堆內(nèi)存分配的內(nèi)存需要程序員自己回收,典型例子,C++,如果語言由GCGC回收,性能稍弱那么一點(diǎn)點(diǎn)點(diǎn)....,但是人家能隨便存啊,多隨便。


          &*的意思

          &叫做取地址符。

          *叫做收地址符吧。

          示例

          var c *int//*int是一個整體,說明c這個變量只能接收int類型的

          *int是一個整體,表示c這個變量只能接收int類型地址

          代碼

          package main
          import "fmt"
          func main() { var c *int var d int = 1 //c = d//錯誤需要的是d的地址 c = &d fmt.Println(c)}

          執(zhí)行結(jié)果。

          可以看到打印的也是一個地址,但是內(nèi)存圖還是基本類型圖。

          如果要打印c的值,直接*c就好了,取得就是地址里面對應(yīng)得值了。

          fmt.Println(*c)


          關(guān)于函數(shù)

          我們一直在強(qiáng)調(diào),操作只會操作上面的,函數(shù)同理。

          package main
          import "fmt"
          func say1(x int) { //x int 相當(dāng)于隱藏了一行代碼 //隱藏的代碼時 var x int = x,一定要記住這個 fmt.Printf("say1:%p\n", x)}func say2(x *int) { //隱藏的代碼是 var x *int = x,x是一個地址 fmt.Printf("say2:%p\n", x)}func say3(x []int) { //隱藏的代碼是 var x []int = x,因?yàn)閤是引用類型,所以x是一個地址 fmt.Printf("say3:%p\n", x)}func main() { say1(1)//棧上面是1,所以傳進(jìn)去就是1 var x1 = 1 say2(&x1)//say只能接收整數(shù)地址 var x2 = []int{11} say3(x2)//x2是引用類型,所以傳進(jìn)去的時候就是地址,棧上面的就是地址}

          執(zhí)行結(jié)果。


          總結(jié)

          上述我們主要講述了基本類型指針引用類型指針,也叫做值類型引用類型,并且畫出了值類型引用類型內(nèi)存的本質(zhì)區(qū)分圖,后來又講了&*的區(qū)別,還有函數(shù)傳參的本質(zhì)是什么,希望對大家的學(xué)習(xí)有幫助。

          如果在操作過程中有任何問題,記得下面留言,我們看到會第一時間解決問題。我是碼農(nóng)星期八,如果覺得還不錯,記得動手點(diǎn)贊一下哈。感謝你的觀看。

          -------------------?End?-------------------

          歡迎大家點(diǎn)贊轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入學(xué)習(xí)群請?jiān)诤笈_回復(fù)【入群

          萬水千山總是情,點(diǎn)個【在看】行不行

          瀏覽 45
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(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>
                  国产午夜黄色视频 | 亚洲日韩一 | 欧美精品久久久久久久久大尺度 | 成人网视频 | 18禁网站网址 |