6.指针
go语言中的指针
go语言中的函数传参都是值拷贝,当我们要修改某个变量的时候,我们可以创建一个指向该变量地址的指针变量。传递数据使用指针,而无需拷贝数据。类型指针不能进行偏移和运算。
&:取地址
*:根据地址取值
指针地址和指针类型
每个变量在运行的时候都拥有一个地址,这个地址代表变量在内存中的位置。
ptr:= &v
// v代表被取地址的变量,类型为T
// prt是用于接收地址的变量,类型是*T,称作T的指针类型
func main(){
a:=10
b:=&a
fmt.Printf("a:%d prt:%p\n",a ,&a) // a:10 prt:0xc000090020
fmt.Printf("b:%v prt:%T\n",b ,b) // b:0xc000090020 prt:*int
fmt.Println(&b) // 0xc000094028
c:=*b // 根据内存地址取值
fmt.Println(*b) //10
fmt.Println(c) //10
}
// 标量b是一个int类型的指针(*int),它储存的是变量a的内存地址
指针在函数中的传递
func modify(x *int){
*x = 100
}
func main(){
x := 1
modify(&x)
fmt.Println(x) // 100
}
make和new的区别
var a *int
*a = 100 // 此时会报错,变量a并没有被分配内存,和值声明没有分配空间的map一样,无法直接使用,必须初始化以后才能使用
a = new(int) // 使用new来给它分配内存
var b map[string]int
b["age"]=15 // 同理,也会报错。只声明了map没有分配内存空间,无法直接使用,需要初始化之后才能使用
b = make(map[string]int, 10)
- new和make都是用来分配内存的
- make只能用于
slice、map、channel的初始化,返回的还是这三个引用类型本身 - new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针

浙公网安备 33010602011771号