您好,登錄后才能下訂單哦!
這篇文章主要介紹“Go語言中指針的用法”,在日常操作中,相信很多人在Go語言中指針的用法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Go語言中指針的用法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在介紹Go的指針之前,我們需要先介紹下,指針是什么?為什么我們需要指針?(備注:這里指的是原始指針。)
1.指針是什么?
首先指針是一個變量,全名叫做指針變量,只不過這個變量里面存儲的值是一個地址而已。所以指針,哪怕是空指針,都是有地址的,因為變量都是有地址的。例子如下:
Output:
從下面的輸出,我們可以看出空指針a的地址是存在,在a指向b之前,指針a的值為nil,指向b之后,數值變成了變量b的地址,而對a 做操作*a的話,數值為變量b對應的數值10。
2.為什么我們需要指針?
我們之所以需要指針,是因為我們要做間接尋址,就是在程序運行的時候,我們希望執行到一個地址段的時候,去跳到另外一個地址段去執行。詳細介紹參見:
知乎:為什么需要指針?
講完了這些之后,讓我們回歸正題,指針在Go中是什么樣子的,它與C++中有何不同之處。
1.使用規則
1).C++使用操作符->,Go使用的操作符變成了.。
2).*的操作是相同的,表示的是取指針指向地址所存儲的數據。
3).C++中,指針需要創建和刪除,new和delete,用來管理和釋放內存空間。Go可以通過make來創建,但是不需要自己釋放。
2.內存中的存儲位置不同
C++中,指針分配的內存在堆中,而Go是在棧中。
C++中,指針指向一個局部變量的話,如果這個局部變量的地址被銷毀了,那么這個指針指向的地址里面的數據,有可能是臟數據。Go中,指針可以指向局部變量,因為變量的外溢,就算這個變量超出了自己的作用域,也不會被釋放,因為還有指針再用,這部分操作是Go在語言層面保證的。
例子:
C++:
該例子示范了,棧內的變量在被指針指向 的時候,一旦改內存位置被再次使用,指針所指向的內存的數據,就變成了一個臟數據。
Output:
b[1024*128]就是為了覆蓋原來局部變量b中的數值,從輸出的結果來看*a的數值,不是10,是32522,變成了一個不期望的數值。
Go:
與C++例子的思路相同,我們通過程序能夠看出來,局部變量b所指向的內存,一旦被指針使用,在指針還有效的前提下,內存是不會被覆蓋的。(備注:該結論也可以通過反匯編代碼來確定。)
Output:
通過輸出來看,就算重新定義了b[1024*1024]大小,局部變量b所占內存的數值,依然是10,并沒有變化。
到此,關于“Go語言中指針的用法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。