Golang指针与结构体结合修改字段方法
作者:吹吹风会发光
时间:2026-01-03
来源:互联网
浏览:0
在Go中修改结构体字段需使用指针:传结构体指针、函数参数声明为指针类型、方法接收者用指针,且操作对象必须可寻址(如变量、slice元素),map元素不可取地址。
在 Go 中修改结构体字段需使用指针:传结构体指针、函数参数声明为指针类型、方法接收者用指针,且操作对象必须可寻址(如变量、slice 元素),map 元素不可取地址。

在 Go 中,通过指针操作结构体可以修改其内部字段,关键在于传递结构体指针而非值拷贝。
结构体指针能直接修改原数据
Go 默认按值传递,传结构体时会复制整个实例;而传 *StructType 时,函数内对字段的赋值会作用于原始结构体。
- 定义结构体后,用 &v 获取其地址(如
ptr := &user) - 通过 (*ptr).Field 或更常用的简写 ptr.Field 访问和修改字段
- 函数参数声明为指针类型(如
func updateUser(u *User)),调用时传&user
常见误操作:忘记取地址或解引用错误
容易混淆的是:变量本身是指针时,不能再对它用 &;而普通变量必须先取地址才能赋给指针变量。
- ❌ 错误:
u := User{Name: "A"}; ptr := &&u(多了一个 &) - ❌ 错误:
u := User{Name: "A"}; u.Name = "B"在函数里这样写,但参数是u User(值拷贝,不改原值) - ✅ 正确:
func setName(u *User, name string) { u.Name = name },调用setName(&user, "New")
嵌套结构体字段也能安全修改
只要路径上的每一层都可寻址(即不是从 map 或 slice 直接取的临时值),就能用指针链式修改。
- 例如:
type Profile struct { Info *Info },若p := &Profile{Info: &Info{Age: 20}},则p.Info.Age = 25有效 - ⚠️ 注意:
s := []User{{Name: "X"}}; ptr := &s[0]合法;但m := map[string]User{"k": {Name: "Y"}}; ptr := &m["k"]编译报错(map 元素不可寻址)
方法接收者用指针可自动修改状态
为结构体定义指针接收者方法后,调用该方法的对象无论是变量还是指针,Go 都会自动处理解引用。
func (u *User) SetName(n string) { u.Name = n }u := User{}; u.SetName("Alice")✅ 自动取地址up := &User{}; up.SetName("Bob")✅ 本来就是指针,直接调用- 值接收者方法(
func (u User))无法修改原结构体字段
不复杂但容易忽略。核心就一条:想改原结构体,函数参数、变量声明、方法接收者,统一用指针类型,并确保操作对象是可寻址的。
作者最新文章
iphone蓝牙连接ipad有什么用及连接方法教程
2026-09-21 17:28
PDF怎么取消密码保护?4种解锁方法整理
2026-09-08 18:23
三星 Galaxy Z Fold8 内屏边角支撑偏软?实测与官方回应
2026-09-08 16:39
手机Excel表格制作教程:小屏幕高效录入与格式调整指南
2026-09-04 09:27
PDF文档按页转换成图片怎么做?在线转换步骤整理
2026-09-03 11:06
上一篇:
米家添加家庭成员方法详解
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多
Windows 10
Windows
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式
Windows/macOS/Linux
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















