Go 语言指针
封面图
•
2025-10-05
•
Go
0
0
0
0
在 Go 语言中,**指针(Pointer)** 是一种变量类型,它存储的是另一个变量的**内存地址**。通过指针,我们可以直接访问和修改内存中的数据。 --- ## 一、基本概念 ### 1. 变量与内存地址 每个变量在内存中都有一个地址,这个地址可以被用来访问该变量的值。 ```go var a int = 10 fmt.Println("a 的值是:", a) fmt.Println("a 的地址是:", &a) ``` 输出示例: ``` a 的值是: 10 a 的地址是: 0xc000006000 ``` ### 2. 指针变量 指针变量存储的是其他变量的地址。 ```go var p *int = &a fmt.Println("p 的值是:", p) // 输出 a 的地址 fmt.Println("p 指向的值是:", *p) // 输出 a 的值 ``` - `*int` 表示这是一个指向 `int` 类型的指针。 - `&a` 获取变量 `a` 的地址。 - `*p` 通过指针访问其指向的值(称为“解引用”)。 --- ## 二、指针的使用 ### 1. 声明指针 ```go var p *int ``` 或者直接初始化: ```go p := &a ``` ### 2. 修改指针指向的值 ```go *p = 20 fmt.Println("a 的值是:", a) // 输出 20 ``` ### 3. 空指针(nil) ```go var p *int fmt.Println(p) // 输出 <nil> ``` 尝试解引用空指针会导致运行时错误(panic)。 --- ## 三、指针的优势 ### 1. 函数间传递参数 Go 语言中,函数参数默认是**值传递**,也就是说函数内部对参数的修改不会影响外部的变量。 使用指针可以实现**引用传递**,让函数修改外部变量的值。 ```go func modifyValue(p *int) { *p = 100 } func main() { a := 10 modifyValue(&a) fmt.Println(a) // 输出 100 } ``` ### 2. 避免复制大对象 如果传入一个结构体或数组,使用指针可以避免复制整个对象,提高效率。 --- ## 四、指针的注意事项 ### 1. 不要解引用空指针 ```go var p *int // *p = 10 // 这行会引发 panic! ``` ### 2. 指针类型必须匹配 ```go var a int = 10 var p *int = &a var q *float64 = &a // ❌ 错误:类型不匹配 ``` --- ## 五、指针与结构体 可以声明指向结构体的指针,并通过指针访问结构体字段。 ```go type Person struct { Name string Age int } func main() { p := Person{"Alice", 30} ptr := &p fmt.Println(ptr.Name) // Alice ptr.Age = 31 fmt.Println(p) // {Alice 31} } ``` --- ## 六、总结 | 概念 | 说明 | |------|------| | 指针 | 存储变量内存地址的变量 | | `&` | 取地址运算符 | | `*` | 解引用运算符 | | 空指针 | `nil`,不能解引用 | | 引用传递 | 使用指针可以修改外部变量 | --- 如果你有具体的应用场景(如指针与 slice、map、结构体等),我可以进一步详细讲解。需要吗?
上一篇:
Go 语言开发工具
下一篇:
Go 语言递归函数
标题录入,一次不能超过6条
返回顶部
留言
留言
评论