Go语言指针
指针
什么是指针
我们都知道程序运行时的数据存放在内存中,每个存储在内存中有一个编号,这个编号就是内存地址,内存地址可以呗赋值给一个指针。
在编程语言中,指针是一种数据类型。用来存储一个内存地址,该地址指向存储在该内存中的对象。
通常情况下,我们将指针理解为内存地址。
指针的声明和定义
Go语言取地址与其他语言相似,使用&
取地址
func main() {
name := "yzy"
Pointer := &name
fmt.Println("name:",name)
fmt.Println("内存地址:",Pointer)
}
Go语言中使用类型名称前加*
的方式即可表示一个对应的指针类型。例如上面示例中的Pointer是*String
类型的指针。
注意:不同指针类型无法相互赋值
var pointer2 *int
pointer3 := new(int)
Go语言还可以通过这两种方式定义指针,第一种方式不能在定义的时候同时赋值,第二种方式参数传递的是指针的类型。
指针的操作
- 获取指针所指向的值
nameValue := *Pointer
- 修改指针所指向的值
*Pointer = "修改后的名字"
fmt.Println("Pointer指向的值:", *Pointer)
fmt.Println("name的值:", name)
指针参数
age := 18
changeAge(age)
fmt.Println("修改后的age值为:", age)
func changeAge(age int) {
age = 20
}
我们期望输出的是修改后的age值为20,但是实际上输出结果如下:
这是因为changeAge函数里面的参数只是一个拷贝,修改它并不会影响原来的值。此时就需要使用指针。
age := 18
changeAge(&age)
fmt.Println("修改后的age值为:", age)
func changeAge(age *int) {
*age = 20
}
结果为:
指针的优势
- 可以修改指向数据的值
- 在变量赋值,参数传值的时候可以节省内存
是否使用指针
- 不要对map,slice, channel 这类引用类型使用指针
- 如果需要修改方法接收者内部的数据或者状态时,需要使用指针
- 如果需要修改参数的值或者内部数据时,也需要使用指针类型的参数
- 如果是比较大的结构体这时候可以考虑使用指针
- 像int、 bool这样的小数据类型没必要使用指针
- 如果需要并发安全,则尽可能地不要使用指针
- 指针最好不要嵌套
转载自:https://juejin.cn/post/7090794678483681310