登录
首页 >  Golang >  Go教程

Golang如何修改外部变量值

时间:2026-01-02 10:54:41 287浏览 收藏

大家好,我们又见面了啊~本文《Golang函数如何修改外部变量值》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

Go函数参数是值传递,只有传指针(T)才能修改外部变量值;需调用时用&取地址、函数声明指针类型、体内用p赋值;注意nil指针解引用panic及指针本身可变性。

如何使用Golang实现指针参数_Golang函数修改外部变量值

为什么传指针才能修改外部变量值

Go 语言函数参数是值传递,哪怕传的是 struct[]int,实际也是拷贝一份副本。原始变量地址没被触及,自然改不动。只有传 *T(指向变量的指针),函数内通过 *p 解引用,才真正操作原始内存位置。

传指针参数的正确写法

调用时必须显式取地址,不能漏掉 &;函数签名要声明为指针类型;函数体内要用 *p = ... 赋值。

  • 错误写法:modify(x)(传值)或 modify(&x) 但函数定义是 func modify(x int)
  • 正确写法:modify(&x) + func modify(p *int) + *p = 42
  • struct 同理:用 &myStruct 传,函数接收 *MyStruct,内部改 p.Field = ...
func increment(p *int) {
    *p = *p + 1
}

func main() {
    x := 10
    increment(&x)
    fmt.Println(x) // 输出 11
}

常见误用和坑

最容易忽略的是 nil 指针解引用 panic,以及混淆指针类型本身是否可变。

  • nil *int 进函数后直接 *p = 5panic: runtime error: invalid memory address or nil pointer dereference
  • func f(p *int) 中,p 本身是值(存着地址),可以重新赋值(如 p = &y),但这不影响调用方的指针变量
  • 数组传指针才有意义;切片本身含指针字段,传切片能改底层数组,但无法改变原切片的长度/容量,此时才需传 *[]T

什么情况不用传指针

小数据(intbool、小 struct)传值开销小,且语义清晰;只读场景没必要暴露可变性;并发中共享指针需额外同步,有时传值更安全。

  • 返回新值比就地修改更符合 Go 的惯用法,例如 strings.ToUpper(s) 不改原串
  • 若函数职责是“计算并返回”,别为了省一次拷贝强行用指针——可读性和安全性优先
  • 结构体字段超过 4–5 个字段,或含大数组/slice/map,再考虑传指针
传指针不是目的,让调用方明确「这个变量会被修改」才是关键。每次写 &*p,都要确认:这里真的需要副作用?调用方是否预期这个行为?

以上就是《Golang如何修改外部变量值》的详细内容,更多关于的资料请关注golang学习网公众号!

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>