简介
Go 语言的指针的含义是:记录某个变量内存地址的变量
var a int = 42
var p *int = &a
变量 p 就是指针变量,它是一个指向 int类型的指针
fmt.Println(p) // 输出地址,例如:0xc000014088
fmt.Println(*p) // 输出 42
*p 意思是解引用
基本操作
修改变量的值
a := 100
P := &a
fmt.Println(*p) // 100
*p = 200
fmt.Println(a) // 200
空指针判断
var p *int
if p == nil {
fmt.Println("p is nil")
}
引用传递
Go 语言中函数的参数默认是值传递,如果想要修改原始值就必须使用指针
func changeValue(p *int) {
*p = 100
}
func main() {
a := 10
changeValue(&a)
fmt.Println(a) // 输出 100
}
- 如果不传指针,原始值不会改变
func changeValue(p int) {
p = 100
}
func main() {
a := 10
changeValue(a)
fmt.Println(a) // 输出 10
}
注意事项
Go 的指针很强大,同时也具有一定的危险性,你得知道
字面量取地址
对一个字面量取内存地址在 Go 中不被允许,因为这可能导致悬空指针
println(&10)
指针类型不匹配
var a int
var p *float64 = &a // 错误,类型不匹配
误用空指针
var p *int
fmt.Println(p) // 输出 <nil>
*p = 1 // panic
总结
想要理解 Go 语言的指针,记住下面的两句话
&:把值变成地址
*:把地址变成值