6.7 值传递和引用传递

本篇学习 Go 函数参数中的值拷贝行为,并能通过指针参数实现对外部变量的修改。

字数 372 字

值传递和引用传递

概念说明

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 魔改
载入天数...载入时分秒...
发表了 0 篇文章 · 发表了 46 篇笔记 · 总计 2 万 5 千字(其中笔记 25104 字)