likes
comments
collection
share

Go语言指针

作者站长头像
站长
· 阅读数 32

指针

什么是指针

我们都知道程序运行时的数据存放在内存中,每个存储在内存中有一个编号,这个编号就是内存地址,内存地址可以呗赋值给一个指针。

在编程语言中,指针是一种数据类型。用来存储一个内存地址,该地址指向存储在该内存中的对象。

通常情况下,我们将指针理解为内存地址。

指针的声明和定义

Go语言取地址与其他语言相似,使用&取地址

func main() {
   name := "yzy"
   Pointer := &name
   fmt.Println("name:",name)
   fmt.Println("内存地址:",Pointer)
}

Go语言指针

Go语言中使用类型名称前加*的方式即可表示一个对应的指针类型。例如上面示例中的Pointer是*String类型的指针。

注意:不同指针类型无法相互赋值

var pointer2 *int
pointer3 := new(int)

Go语言还可以通过这两种方式定义指针,第一种方式不能在定义的时候同时赋值,第二种方式参数传递的是指针的类型。

指针的操作

  1. 获取指针所指向的值
nameValue := *Pointer
  1. 修改指针所指向的值
*Pointer = "修改后的名字"
fmt.Println("Pointer指向的值:", *Pointer)
fmt.Println("name的值:", name)

Go语言指针

指针参数

age := 18
changeAge(age)
fmt.Println("修改后的age值为:", age)

func changeAge(age int) {
   age = 20
}

我们期望输出的是修改后的age值为20,但是实际上输出结果如下:

Go语言指针

这是因为changeAge函数里面的参数只是一个拷贝,修改它并不会影响原来的值。此时就需要使用指针。

age := 18
changeAge(&age)
fmt.Println("修改后的age值为:", age)

func changeAge(age *int) {
   *age = 20
}

结果为:

Go语言指针

指针的优势

  1. 可以修改指向数据的值
  2. 在变量赋值,参数传值的时候可以节省内存

是否使用指针

  1. 不要对map,slice, channel 这类引用类型使用指针
  2. 如果需要修改方法接收者内部的数据或者状态时,需要使用指针
  3. 如果需要修改参数的值或者内部数据时,也需要使用指针类型的参数
  4. 如果是比较大的结构体这时候可以考虑使用指针
  5. 像int、 bool这样的小数据类型没必要使用指针
  6. 如果需要并发安全,则尽可能地不要使用指针
  7. 指针最好不要嵌套