指针(Pointer)
Go 语言中的指针用于存储变量的内存地址。通过指针,可以直接访问或修改变量的值,而无需复制该变量。与其他语言不同,Go 不支持指针运算,但通过指针可以实现高效的参数传递和共享数据。
指针可以进行的操作
- 获取指针:使用
&
操作符获取变量的地址。 - 解引用指针:使用
*
操作符访问指针指向的变量值。 - 修改指针指向的值:通过解引用指针直接修改变量的值。
- 指针默认值:指针的零值是
nil
,表示没有指向任何有效地址。
示例代码
// 定义变量
var a int = 42
// 获取变量的指针
var p *int = &a
// 访问指针指向的值
fmt.Println(*p) // 输出 42
// 修改指针指向的值
*p = 50
fmt.Println(a) // 输出 50
// 指针的零值
var p2 *int
fmt.Println(p2) // 输出 <nil>
特别注意
- 指针是值类型:当将指针作为参数传递给函数时,传递的是指针的副本,但它仍然指向相同的内存地址。因此,修改指针指向的值会影响原始变量。
- 不支持指针运算:Go 中不允许像 C 或 C++ 那样对指针进行算术运算,只能通过
&
和*
来获取和解引用指针。 - 避免空指针引用:解引用
nil
指针会引发运行时错误,因此使用指针前必须确保它们指向有效地址。
示例:通过指针修改函数参数的值
// 函数通过指针修改参数
func modifyValue(x *int) {
*x = 100
}
func main() {
a := 50
modifyValue(&a) // 传递变量 a 的指针
fmt.Println(a) // 输出 100
}
总结
- 指针用于存储变量的内存地址,通过指针可以高效地共享和修改数据。
- 使用
&
获取变量的地址,使用*
访问或修改指针指向的值。 - Go 不支持指针运算,但通过指针可以实现类似引用传递的效果。