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只能用于slicemapchannel的初始化,返回的还是这三个引用类型本身
  • new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针
posted @ 2025-06-20 14:31  L大官  阅读(8)  评论(0)    收藏  举报