GO-指针:引用、解引用、指针传递

指针是 Go 语言中非常重要的概念之一。它允许我们直接操作变量的内存地址,从而实现更高效的内存管理。Go
语言中的指针可以进行引用、解引用,还可以用作函数参数来实现指针传递。

1. 指针的引用

在 Go 语言中,可以使用 & 操作符来获取变量的地址,从而创建指向该变量的指针。

1
2
3
var x int = 10
var ptr *int = &x // 使用 & 获取 x 的地址,并赋给 ptr
fmt.Println(ptr) // 输出 x 的地址

在上述代码中,ptr 是一个指针,指向变量 x 的内存地址。*int 表示 ptr 是一个指向整数类型的指针。

2. 指针的解引用

指针保存的是地址,要获取指针指向的值,可以使用 * 操作符。这种操作被称为“解引用”。

1
2
3
fmt.Println(*ptr)  // 输出指针 ptr 所指向的值,即变量 x 的值
*ptr = 20 // 通过指针修改 x 的值
fmt.Println(x) // 输出 20

通过解引用操作,可以直接修改指针所指向变量的值,从而实现对原始数据的直接操作。

3. 指针传递

在 Go 中,函数参数默认是值传递,也就是说,函数接收的是参数的副本而不是原始数据。如果希望函数修改原始变量的值,可以传递指针。

1
2
3
4
5
6
7
func increment(num *int) {
*num += 1 // 修改指针指向的值
}

var x int = 5
increment(&x) // 传递 x 的地址
fmt.Println(x) // 输出 6

在上面的示例中,increment 函数接收一个整数指针,通过指针修改原始数据的值。

4. 指针的应用示例

以下是一个综合示例,演示了引用、解引用和指针传递:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import "fmt"

// 定义一个结构体
type Person struct {
Name string
Age int
}

// 修改年龄
func increaseAge(p *Person) {
p.Age += 1 // 通过指针修改原始数据
}

func main() {
p := Person{Name: "Alice", Age: 25}
fmt.Println("Before:", p.Age)

increaseAge(&p) // 传递结构体的地址
fmt.Println("After:", p.Age) // 输出 26
}

在这个例子中,increaseAge 函数接收 Person 的指针参数,并通过指针修改 Age 字段的值。这种方式可以避免结构体的拷贝,提升代码效率。