日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
一篇文章帶你了解Go語言基礎(chǔ)之指針

前言

專注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)海南免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000+企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

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

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

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

引言

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

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

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

基本類型指針的理解

先看這兩行代碼。

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

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

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

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

如圖所示。

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

引用類型指針的理解

先看這樣的代碼。

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

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

值類型和引用類型

值類型

在Go中,值類型主要有。

int,float,bool,string,數(shù)組,struct(結(jié)構(gòu)體)

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

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

引用類型

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

切片(slice),map,管道(chan)

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

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

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

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

&和*的意思

&叫做取地址符。

*叫做收地址符吧。

示例

 
 
 
 
  1. var c *int//*int是一個(gè)整體,說明c這個(gè)變量只能接收int類型的 

*int是一個(gè)整體,表示c這個(gè)變量只能接收int類型的地址。

代碼

 
 
 
 
  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func main() { 
  6.     var c *int 
  7.     var d int = 1 
  8.     //c = d//錯(cuò)誤需要的是d的地址 
  9.     c = &d 
  10.     fmt.Println(c) 

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

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

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

 
 
 
 
  1. fmt.Println(*c) 

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

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

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

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

總結(jié)

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

如果在操作過程中有任何問題,記得下面留言,我們看到會(huì)第一時(shí)間解決問題。

本文轉(zhuǎn)載自微信公眾號(hào)「Go語言進(jìn)階學(xué)習(xí)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Go語言進(jìn)階學(xué)習(xí)公眾號(hào)。


當(dāng)前名稱:一篇文章帶你了解Go語言基礎(chǔ)之指針
文章URL:http://www.5511xx.com/article/cdhcgpc.html