章节

6.7 参数传递与指针

本篇学习 Go 函数参数中的值拷贝行为,理解 Go 没有“引用传递”,并能通过指针参数实现对外部变量的修改。

参数传递与指针

概念说明

Go 的函数参数传递本质上都是“值拷贝”。
也就是说,Go 并不存在单独一种“引用传递”机制。
当参数类型是普通值(如 int)时,函数里改的是副本。
当参数类型是指针(如 *int)时,拷贝的是地址值,但可以通过该地址修改原变量。

语法/规则

  1. 普通值参数不会直接影响外部变量。
  2. 指针参数可通过 *指针 修改外部变量。
  3. 调用指针参数函数时,通常要传 &变量
  4. 理解“拷贝值”与“能否改到原数据”是区分这两种写法的关键。

对比示例

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

import "fmt"

func changeByValue(num int, outer *int) {
	fmt.Println(outer == &num) // false:不是同一个地址
	num = 2 // 只修改副本
}

func changeByPointer(num *int, outer *int) {
	fmt.Println(outer == num) // true:是同一个地址
	*num = 2 // 通过指针修改原变量
}

func main() {
	num := 20

	changeByValue(num, &num)
	fmt.Println(num)

	changeByPointer(&num, &num)
	fmt.Println(num)
}

输出结果:

1
2
3
4
false
20
true
2

常见错误

  1. 误以为普通值参数在函数内修改后会自动影响外部变量。
  2. 调用指针参数函数时忘记传 &,导致类型不匹配。
  3. nil 指针解引用(*p)会触发运行时 panic。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字