指針類型
tips: *號,可以指向指針類型內(nèi)存地址上的值,&號,可以獲取值類型的內(nèi)存地址
變量和內(nèi)存地址
每一個變量都有內(nèi)存地址,可以通過變量來操作內(nèi)存地址中的值,即內(nèi)存的大小
go語言中獲取變量的內(nèi)存地址方法:通過&符號可以獲取變量的地址
var a int32
a = 100
fmt.Printf(“%d\n”, a) //變量的值
fmt.Printf(“%p\n”, &a) //變量的內(nèi)存地址
數(shù)據(jù)類型
值類型
定義:普通變量存儲的是對應(yīng)類型的值,這些類型就叫值類型
var b int32
b = 156
fmt.Printf(“%d\n”, b)
fmt.Printf(“%p\n”, &b)
變量b,在內(nèi)存中的地址為:0x1040a124,在這個內(nèi)存地址上存儲的值為:156
指針類型(引用類型)
定義:指針類型的變量存儲的是?個地址,所以?叫指針類型或引?類型
var b int32
b = 156
var a *int32
a = &b
b 是值類型,它指向的是內(nèi)存地址上的值
a是指針類型,它指向的是b的內(nèi)存地址
指針類型的定義
指針類型定義,語法: 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的值
之前學(xué)過的切片是引用類型
內(nèi)存的分配
make?來分配引?類型的內(nèi)存,?如 map、slice以及channel
new?來分配除引?類型的所有其他類型的內(nèi)存,?如 int、數(shù)組等
值類型和指針類型的拷貝
值類型的拷貝是深度拷貝,會將給拷貝的值創(chuàng)建一個新的內(nèi)存空間,存儲值
指針類型的拷貝是淺拷貝,拷貝后的值,指向的內(nèi)存地址和原值的內(nèi)存地址一樣,修改其中一個值,這個內(nèi)存地址上的值都會改變
var a int = 100
var b *int = &a
var c *int = b
var d int = a
*c = 200
這里a,d是值類型,b,c是指針類型
d就相當(dāng)于把a內(nèi)存地址上值,在內(nèi)存中從新開辟了一塊空間存儲,d和a互不影響
b,c相當(dāng)于指向了a的內(nèi)存地址,當(dāng)使用*號引用出內(nèi)存地址上的變量上,修改值得,a的值也會跟著改變