tips: *號,可以指向指針類型內存地址上的值,&號,可以獲取值類型的內存地址
變量和內存地址
每一個變量都有內存地址,可以通過變量來操作內存地址中的值,即內存的大小
go語言中獲取變量的內存地址方法:通過&符號可以獲取變量的地址
var a int32
a = 100
fmt.Printf(“%d\n”, a) //變量的值
fmt.Printf(“%p\n”, &a) //變量的內存地址
數據類型
值類型
定義:普通變量存儲的是對應類型的值,這些類型就叫值類型
var b int32
b = 156
fmt.Printf(“%d\n”, b)
fmt.Printf(“%p\n”, &b)
變量b,在內存中的地址為:0x1040a124,在這個內存地址上存儲的值為:156
指針類型(引用類型)
定義:指針類型的變量存儲的是⼀個地址,所以⼜叫指針類型或引⽤類型
var b int32
b = 156
var a *int32
a = &b
b 是值類型,它指向的是內存地址上的值
a是指針類型,它指向的是b的內存地址
指針類型的定義
指針類型定義,語法: var 變量名 *類型
b := 255
var a *int = &b
fmt.Printf("Type of a is %T\n", a)
fmt.Println("address of b is", a)
指針類型在定義完成后,默認為空地址,即空指針(nil)
操作指針類型變量
在定義好指針變量后,可以通過***** 符號可以獲取指針變量指向的變量
b := 255
a := &b
fmt.Println("address of b is", a)
fmt.Println("value of b is", *a)
*a++
fmt.Println("new value of b is", b)
在這里的 *a 等價於 b,通過修改 *a ,最終修改的是值類型b的值
之前學過的切片是引用類型
內存的分配
make⽤來分配引⽤類型的內存,⽐如 map、slice以及channel
new⽤來分配除引⽤類型的所有其他類型的內存,⽐如 int、數組等
值類型和指針類型的拷貝
值類型的拷貝是深度拷貝,會將給拷貝的值創建一個新的內存空間,存儲值
指針類型的拷貝是淺拷貝,拷貝后的值,指向的內存地址和原值的內存地址一樣,修改其中一個值,這個內存地址上的值都會改變
var a int = 100
var b *int = &a
var c *int = b
var d int = a
*c = 200
這里a,d是值類型,b,c是指針類型
d就相當於把a內存地址上值,在內存中從新開辟了一塊空間存儲,d和a互不影響
b,c相當於指向了a的內存地址,當使用*號引用出內存地址上的變量上,修改值得,a的值也會跟着改變
