這篇文章主要介紹“Go語(yǔ)言中指針的用法”,在日常操作中,相信很多人在Go語(yǔ)言中指針的用法問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Go語(yǔ)言中指針的用法”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)公司專注于鄄城網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供鄄城營(yíng)銷型網(wǎng)站建設(shè),鄄城網(wǎng)站制作、鄄城網(wǎng)頁(yè)設(shè)計(jì)、鄄城網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造鄄城網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鄄城網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
在介紹Go的指針之前,我們需要先介紹下,指針是什么?為什么我們需要指針?(備注:這里指的是原始指針。)
1.指針是什么?
首先指針是一個(gè)變量,全名叫做指針變量,只不過(guò)這個(gè)變量里面存儲(chǔ)的值是一個(gè)地址而已。所以指針,哪怕是空指針,都是有地址的,因?yàn)樽兞慷际怯械刂返摹@尤缦拢?/p>
Output:
從下面的輸出,我們可以看出空指針a的地址是存在,在a指向b之前,指針a的值為nil,指向b之后,數(shù)值變成了變量b的地址,而對(duì)a 做操作*a的話,數(shù)值為變量b對(duì)應(yīng)的數(shù)值10。
2.為什么我們需要指針?
我們之所以需要指針,是因?yàn)槲覀円鲩g接尋址,就是在程序運(yùn)行的時(shí)候,我們希望執(zhí)行到一個(gè)地址段的時(shí)候,去跳到另外一個(gè)地址段去執(zhí)行。詳細(xì)介紹參見(jiàn):
知乎:為什么需要指針?
講完了這些之后,讓我們回歸正題,指針在Go中是什么樣子的,它與C++中有何不同之處。
1.使用規(guī)則
1).C++使用操作符->,Go使用的操作符變成了.。
2).*的操作是相同的,表示的是取指針指向地址所存儲(chǔ)的數(shù)據(jù)。
3).C++中,指針需要?jiǎng)?chuàng)建和刪除,new和delete,用來(lái)管理和釋放內(nèi)存空間。Go可以通過(guò)make來(lái)創(chuàng)建,但是不需要自己釋放。
2.內(nèi)存中的存儲(chǔ)位置不同
C++中,指針?lè)峙涞膬?nèi)存在堆中,而Go是在棧中。
C++中,指針指向一個(gè)局部變量的話,如果這個(gè)局部變量的地址被銷毀了,那么這個(gè)指針指向的地址里面的數(shù)據(jù),有可能是臟數(shù)據(jù)。Go中,指針可以指向局部變量,因?yàn)樽兞康耐庖?,就算這個(gè)變量超出了自己的作用域,也不會(huì)被釋放,因?yàn)檫€有指針再用,這部分操作是Go在語(yǔ)言層面保證的。
例子:
C++:
該例子示范了,棧內(nèi)的變量在被指針指向 的時(shí)候,一旦改內(nèi)存位置被再次使用,指針?biāo)赶虻膬?nèi)存的數(shù)據(jù),就變成了一個(gè)臟數(shù)據(jù)。
Output:
b[1024*128]就是為了覆蓋原來(lái)局部變量b中的數(shù)值,從輸出的結(jié)果來(lái)看*a的數(shù)值,不是10,是32522,變成了一個(gè)不期望的數(shù)值。
Go:
與C++例子的思路相同,我們通過(guò)程序能夠看出來(lái),局部變量b所指向的內(nèi)存,一旦被指針使用,在指針還有效的前提下,內(nèi)存是不會(huì)被覆蓋的。(備注:該結(jié)論也可以通過(guò)反匯編代碼來(lái)確定。)
Output:
通過(guò)輸出來(lái)看,就算重新定義了b[1024*1024]大小,局部變量b所占內(nèi)存的數(shù)值,依然是10,并沒(méi)有變化。
到此,關(guān)于“Go語(yǔ)言中指針的用法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!