Go语言函数参数传递:值传递与指针引用详解

Hazel
Hazel
发布时间:2026-10-14| 7人浏览过
原创

在Go语言开发中,理解函数参数的传递机制是掌握内存管理的基础。本文将深入解析值传递与指针引用的核心差异,并通过经典的数值交换示例,清晰展示这两种方式对原始数据的影响,帮助开发者避免因错误使用引用而导致的意外状态变更。

值传递:默认的参数传递机制

Go语言默认采用“调用通过值”(Call by Value)的方式传递参数。这意味着当调用函数时,系统会将实参的实际值复制一份副本传递给函数的形参。由于函数内部操作的是这份副本,因此在函数体内对形参的任何修改都不会影响函数外部的原始变量。

第1步:定义值传递的交换函数

为了直观演示值传递的特性,我们首先定义一个名为 swap 的函数。该函数接收两个整型变量,尝试交换它们的值:

/* 通过值传递交换数值 */
func swap(x int, y int) int {
    var temp int
    temp = x /* 保存 x 的值 */
    x = y    /* 将 y 的值赋给 x */
    y = temp /* 将 temp 的值赋给 y */
    return temp
}

第2步:调用并观察结果

在主函数中定义变量并调用上述 swap 函数,观察调用前后的变量状态:

package main
import "fmt"

func main() {
    /* 局部变量定义 */
    var a int = 100
    var b int = 200

    fmt.Printf("Before swap, value of a : %d\n", a)
    fmt.Printf("Before swap, value of b : %d\n", b)

    /* 调用函数交换数值 */
    swap(a, b)

    fmt.Printf("After swap, value of a : %d\n", a)
    fmt.Printf("After swap, value of b : %d\n", b)
}

执行上述代码,输出结果如下:

Before swap, value of a : 100
Before swap, value of b : 200
After swap, value of a : 100
After swap, value of b : 200

从结果可以看出,尽管函数内部完成了交换逻辑,但外部变量 a 和 b 的值保持原样。这证实了值传递仅作用于局部副本。

指针引用:实现地址共享的操作

若需要在函数内部修改外部变量的值,必须使用“调用通过指针”(Call by Reference)。这种方式将变量的内存地址传递给函数,使得形参成为指向原始数据的指针。在函数内解引用这些指针,即可直接访问并修改原始内存中的数据。

第3步:定义指针类型的交换函数

修改 swap 函数,使其接收整型指针作为参数。注意函数签名的变化,形参类型为 *int:

/* 通过指针引用交换数值 */
func swap(x *int, y *int) {
    var temp int
    temp = *x       /* 保存地址 x 处的值 */
    *x = *y         /* 将地址 y 处的值放入地址 x */
    *y = temp       /* 将 temp 的值放入地址 y */
}

第4步:传入地址并完成调用

在调用 swap 时,需要使用取地址运算符 & 获取变量的内存地址,并将它们传递给函数:

package main
import "fmt"

func main() {
    /* 局部变量定义 */
    var a int = 100
    var b int = 200

    fmt.Printf("Before swap, value of a : %d\n", a)
    fmt.Printf("Before swap, value of b : %d\n", b)

    /* 调用函数,传递地址 */
    swap(&a, &b)

    fmt.Printf("After swap, value of a : %d\n", a)
    fmt.Printf("After swap, value of b : %d\n", b)
}

func swap(x *int, y *int) {
    var temp int
    temp = *x       /* 保存地址 x 处的值 */
    *x = *y         /* 将地址 y 处的值放入地址 x */
    *y = temp       /* 将 temp 的值放入地址 y */
}

再次运行程序,输出结果如下:

Before swap, value of a : 100
Before swap, value of b : 200
After swap, value of a : 200
After swap, value of b : 100

此时可以清晰地看到,函数外部的变量 a 和 b 发生了预期的交换。这是因为函数通过指针直接操作了它们的内存地址。

总结与最佳实践

通过对比两次实验结果,我们可以得出明确结论:swap(a, b) 传递的是值的副本,无法影响外部状态;而 swap(&a, &b) 传递的是内存地址,实现了真正的引用修改。在Go语言编程中,选择哪种方式取决于具体需求。对于大型结构体或切片,传递指针不仅能修改数据,还能避免昂贵的拷贝开销;但对于不需要改变外部状态的简单计算,值传递提供了更好的数据隔离性和安全性。

以上就是Go语言中函数参数传递与调用的详细内容,更多关于Go语言基础知识的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。