您的位置:首页 >Golang指针如何修改变量值?
发布于2026-02-14 阅读(0)
扫一扫,手机访问
Go中修改原始变量值必须用&取地址传指针,再用*解引用赋值;结构体需修改时应传指针;nil指针须判空;切片/map/channel传值即可改内容,改变量本身才需指针。

& 和 * 修改原始变量的值Go 中指针的核心就两条:用 & 取地址,用 * 解引用。想改原变量,必须传入它的地址(即指针),并在函数内通过 * 赋值。
常见错误是传值后试图修改形参——这只会改副本,不影响原变量:
func badInc(x int) { x++ } // 无效:x 是 copy
正确做法是传指针:
*int 类型参数&x,不是 x*x = *x + 1 或 *x++ 修改结构体较大或需修改字段时,必须传指针;否则函数内修改的是整个结构体的拷贝,原结构体不变。
例如:
type User struct{ Name string; Age int }
func updateUser(u *User) { u.Name = "Alice"; u.Age = 30 } // ✅ 修改生效
func updateUserCopy(u User) { u.Name = "Bob" } // ❌ 原 u.Name 不变
注意:即使结构体很小(如只有两个 int),只要目标是“修改原值”,就该用指针——语义清晰,且避免未来字段扩容带来的隐性 bug。
对 nil 指针执行 * 操作会直接 panic:panic: runtime error: invalid memory address or nil pointer dereference。
在修改前务必检查是否为 nil:
if p == nil { return } 或返回错误new(T) 或 &T{},而非裸声明 var p *T(此时为 nil)示例:
func safeInc(p *int) {
if p == nil { return }
*p++
}
不用。切片、map、channel 的底层结构包含指针(如 slice header 里有指向底层数组的指针),所以传值即可修改其内容(如追加元素、增删 key)。
但要注意:如果想修改变量本身(比如让一个 slice 变成 nil,或换一个底层数组),就必须传 *[]T、*map[K]V 等指针:
append(s, x) 不需要指针——能改内容s = append(s, x) 在函数内赋值,不改变调用方的 s 变量——此时要传 *[]intdelete(m, k) 可以删 key,但 m = make(map[int]string) 不会影响原 map,除非传 *map[int]string容易忽略的是:函数签名一旦用了指针,调用方就得显式传地址,这点和普通变量一致,别漏掉 &。
下一篇:WPS云文档如何创建协作文件
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9