作為21世紀的c語言,go可能多方面思考,最終還是保留了指標
因為go語言是類c語言,所以為了提高效率,仍然保留了指標。
但是如果沒有接觸過指標,可能學起來指標需要多多思考一下了。
指標通常情況下,也被稱為小白勸退神奇。
先看這兩行**。
var n1 int
=666
fmt.
println
(n1)
//結果:666
fmt.
printf
("%p\n",n1)
//結果:%!p(int=666),說明不是乙個位址,就是乙個值
記憶體分布圖如下。
再看看這樣兩行**,這裡用到了&
。
var n1 int=1
//表示取n1的位址
fmt.
println
(&n1)
//結果:0xc00000a0b8
fmt.
printf
("%p\n",&n1)
//結果:0xc00000a0b8
如圖所示。
理解的話就這幾句
預設只會操作記憶體位址上面的值
如果是指標,記憶體上面的值存的就是位址,
如果這兩個能理解,恭喜你,指標已經會了一半了。
先看這樣的**。
var studentlist =
string
//乙個切片
fmt.
println
(studentlist)
//結果:[張三 李四]
fmt.
printf
("%p\n", studentlist)
//結果:0xc0000044a0
//去位址
fmt.
printf
("%p\n", &studentlist)
//結果:0xc0000044a0
記憶體分布圖如下。
在go中,值型別主要有。
int
,float
,bool
,string
,陣列
,struct(結構體)
記憶體分布大致如下。
注:像字串
,陣列
,結構體
這些屬於連續儲存,變數指向的是它們的第乙個位址,剩下的會根據長度計算。
在go中,引用型別主要有。
切片(slice)
,map
,管道(chan)
記憶體分布大致如下。
棧內存在儲存上,只能存一些簡單的東西,比如數字了,字元了,浮點數了之類的,但是棧記憶體分配的記憶體程式設計師不用**,由系統自己**,並且效能很高。
堆內存在儲存上就比較豐富了,隨便存,像map,隨便塞,但是堆記憶體分配的記憶體需要程式設計師自己**,典型例子,c++
,如果語言由gc
由gc
**,效能稍弱那麼一點點點…,但是人家能隨便存啊,多隨便。
&
叫做取位址符。
*
叫做收位址符吧。
示例
var c *
int//*int是乙個整體,說明c這個變數只能接收int型別的
*int
是乙個整體,表示c這個變數只能接收**int
型別的位址**。
**
package main
import
"fmt"
func
main()
執行結果。
可以看到列印的也是乙個位址,但是記憶體圖還是基本型別圖。
如果要列印c
的值,直接*c
就好了,取得就是位址裡面對應得值了。
fmt.
println
(*c)
我們一直在強調,操作只會操作棧上面的值,函式同理。
package main
import
"fmt"
func
say1
(x int
)func
say2
(x *
int)
func
say3
(x [
]int
)func
main()
say3
(x2)
//x2是引用型別,所以傳進去的時候就是位址,棧上面的就是位址
}
執行結果。
上述我們主要講述了基本型別指標和引用型別指標,也叫做值型別和引用型別
並且畫出了值型別和引用型別記憶體的本質區分圖
後來又講了&
和*
的區別,還有函式傳參的本質是什麼
我是碼農星期八,如果覺得還不錯,記得動手點讚一下哈。
感謝你的**。
Go語言基礎之指標
go語言中的函式傳參都是值拷貝,當想修改某個變數時,就使用指標來操作。go中的指標 取位址 根據位址取值 每個變數在執行時都有乙個記憶體位址。go中使用 變數名,對變數進行取位址操作。go中的值型別 int float bool string array struct 都有對應的指標型別如 int ...
Go語言基礎之指標
區別於c c 中的指標,go語言中的指標不能進行偏移和運算,是安全指標。go語言中的函式傳參都是值拷貝,當我們想要修改某個變數的時候,我們可以建立乙個指向該變數位址的指標變數。傳遞資料使用指標,而無須拷貝資料。型別指標不能進行偏移和運算。go語言中的指標操作非常簡單,只需要記住兩個符號 取位址 和 ...
十四 Go語言基礎之指標
區別於c c 中的指標,go語言中的指標不能進行偏移和運算,是安全指標。任何程式資料載入記憶體後,在記憶體都有他們的位址,這就是指標。而為了儲存乙個資料在記憶體中的位址,我們就需要指標變數。比如,永遠不要高估自己 這句話是我的座右銘,我想把它寫入程式中,程式一啟動這句話是要載入到記憶體 假設記憶體位...