概念
任何程序數(shù)據(jù)載入內(nèi)存后,在內(nèi)存都有他們的地址,這就是指針察绷。而為了保存一個數(shù)據(jù)在內(nèi)存中的地址汁针,我們就需要指針變量术辐。
指針地址和指針類型
取變量指針
v := name
ptr := &name
-
name
:表示被取出的變量。類型為:string
-
ptr
:用于接收地址的變量施无,類型為*string
辉词,稱為string
的指針類型。*
代表指針猾骡。
package main
import "fmt"
func main(){
name := "jack"
ptr := &name
// 通過 & 去可以取變量在內(nèi)存中的地址
fmt.Printf("%p\n",&name) //0xc0000421f0
fmt.Println(ptr) //0xc0000421f0
}
指針取值
package main
import "fmt"
func main(){
name := "jack"
ptr := &name
// 通過 & 去可以取變量在內(nèi)存中的地址
fmt.Printf("%p\n",&name) //0xc0000421f0
fmt.Println(ptr) //0xc0000421f0
// 對地址變量取址
fmt.Println(&ptr) //0xc000006028
// 指針取值
fmt.Println(*ptr) // jack
}
取地址操作符
&
和取值操作符*
是一對互補操作符瑞躺,&
取出地址,*
根據(jù)地址取出內(nèi)存中對應(yīng)的值兴想。
- 對變量進(jìn)行取地址(&)操作幢哨,可以獲得這個變量的指針變量。
- 指針變量的值是指針的地址襟企。
- 對指針變量進(jìn)行取值(*)操作嘱么,可以獲取指針變量指向的原變量的值。
指針傳值示例
package main
import "fmt"
func f1(x int){
x = 123
}
func f2(x *int){
*x = 321
}
func main(){
// 傳的是復(fù)制的值顽悼,兩個值是存在不同的內(nèi)存中
a := 1
f1(a)
fmt.Println(a) //1
//傳的是變量的地址曼振,指向同一塊內(nèi)存
f2(&a)
fmt.Println(a) //321
}
分配內(nèi)存的函數(shù)
new
package main
import "fmt"
func main() {
// new函數(shù)的簽名
func new(Type) *Type
// Type:表示類型,*Type:表示類型指針
// 使用new函數(shù)是一個類型的指針
a := new(int)
b := new(string)
fmt.Printf("%T\n", a) // *int
fmt.Printf("%T\n", b) //*string
fmt.Printf("%v\n", a) //0xc000070068
fmt.Printf("%v\n", *a) // 0
fmt.Printf("%v\n", b) //0xc0000581e0
fmt.Printf("%v\n", *b) // ''
// 變量的定義
var p *int
// *p = 123
// panic: runtime error: invalid memory address or nil pointer dereference
// 變量的初始化
p = new(int)
*p = 123
fmt.Println(*p) // 123
}
make
make也是用于內(nèi)存分配的蔚龙,區(qū)別于new冰评,它只用于slice、map以及chan的內(nèi)存創(chuàng)建木羹,而且它返回的類型就是這三個類型本身甲雅,而不是他們的指針類型解孙,因為這三種類型就是引用類型,所以就沒有必要返回他們的指針了
package main
import "fmt"
func main(){
// make函數(shù)的簽名
func make(t Type, size ...IntegerType) Type
var b map[string]int
b = make(map[string]int, 10)
b["沙河娜扎"] = 100
fmt.Println(b)
}
make和new的區(qū)別
- 二者都是用來做內(nèi)存分配的
- make只用于
slice
抛人、map
以及channel
的初始化弛姜,返回的還是這三個引用類型的本身。 - 而new用于類型的內(nèi)存分配妖枚,并且內(nèi)存對應(yīng)的值為類型零型廷臼,返回的是指針類型的指針。