Go 中的指针基础
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 19 课,共 107 课。
指针是一种存储另一个变量内存地址的变量。它不直接保存值,而是保存该值在内存中的位置。指针对 Go 至关重要,也是高效处理数据的基础。
要创建指针,请使用 & 运算符获取变量的地址,并使用 * 运算符声明指针类型,或访问该地址处的值。
x := 42
p := &x // p 保存着 x 的内存地址
fmt.Println(p) // 0xc000018030(内存地址)
fmt.Println(*p) // 42(该地址处的值)& 运算符表示“取地址”,并返回一个指针。* 运算符用于指针时,表示“取值”,这个操作称为解引用。你还可以通过指针修改原始值。
x := 10
p := &x
*p = 25 // 通过指针修改值
fmt.Println(x) // 25(原变量的值已改变)指针类型写作 *T,其中 T 是指针指向的类型。指向 int 的指针类型是 *int。
var p *int // 声明一个指向 int 的指针
x := 100
p = &x // p 现在指向 x指针的零值是 nil,这表示它不指向任何内容。尝试解引用 nil 指针会导致运行时恐慌,因此使用指针前一定要确保已将其初始化。
挑战
简单让我们构建一个简单的值交换器,展示如何通过指针和内存地址修改变量。
你需要将代码分成两个文件:
swap.go:创建一个名为SwapValues的函数,它接受两个*int指针作为参数。这个函数应交换这两个指针指向的值。调用后,每个变量都应保存对方原来的值。这个函数不返回任何内容,而是直接通过指针修改值。main.go:从输入中读取两个整数,将它们存入变量,然后使用你的SwapValues函数交换它们的值。在交换前后打印这两个值,以展示变化。
将提供以下输入:
- 第 1 行:第一个整数
- 第 2 行:第二个整数
输出格式:
Before: a=[first] b=[second]
After: a=[first] b=[second]例如,给定 10 和 25,你的输出应为:
Before: a=10 b=25
After: a=25 b=10记得在将变量传给函数时使用 & 运算符,并在函数内部使用 * 运算符来访问和修改实际值。
亲手试试
package main
import "fmt"
func main() {
// 从输入中读取两个整数
var a, b int
fmt.Scanln(&a)
fmt.Scanln(&b)
// 输出交换前的值
fmt.Printf("Before: a=%d b=%d\n", a, b)
// TODO: 用指向 a 和 b 的指针调用 SwapValues 函数
// 记得用 & 运算符传递地址
// 输出交换后的值
fmt.Printf("After: a=%d b=%d\n", a, b)
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Go 在线编译器