Golang使用指针修改结构体字段的示例解析
发布时间 - 2026-01-09 00:00:00 点击率:次传结构体指针才能修改原字段,因为Go函数参数是值传递,传结构体副本无法影响原变量,只有传*Struct并通过解引用才能写回原始内存。
为什么传结构体指针才能修改原字段
Go 函数参数是值传递,传 struct 本身会复制整个结构体。哪怕只改一个 int 字段,函数内操作的也是副本,原变量不受影响。只有传 *MyStruct,函数拿到的是内存地址,才能通过解引用(*)写回原始内存位置。
修改结构体字段的两种常见写法对比
假设结构体定义为:
type User struct {
Name string
Age int
}下面两种方式都能改字段,但适用场景不同:
- 直接在函数内解引用赋值:适合单次、明确字段名的操作
- 用方法接收者声明为指针:适合复用逻辑、链式调用或需要同时读写多个字段
错误示范(传值无法修改):
func updateUser(u User) {
u.Name = "Alice" // 只改了副本
}
u := User{Name: "Bob"}
updateUser(u)
fmt.Println(u.Name) // 输出 Bob,没变
正确写法(传指针):
func updateUser(u *User) {
u.Name = "Alice" // u 是指针,u.Name 等价于 (*u).Name
}
u := User{Name: "Bob"}
updateUser(&u)
fmt.Println(u.Name) // 输出 Al
ice
方法接收者用 *T 还是 T?看是否要改字段
如果方法里要修改接收者的字段,接收者必须是 *T。否则编译报错:cannot assign to u.Name in method expression。
-
func (u User) setName(n string):u是副本,u.Name = n不影响调用方 -
func (u *User) setName(n string):可安全修改原结构体的Name字段 - 即使结构体很大,用
*T接收者也更高效——只传 8 字节地址,而非整个结构体拷贝
容易忽略的 nil 指针解引用 panic
传入 nil 指针后直接访问字段,运行时 panic:panic: runtime error: invalid memory address or nil pointer dereference。
- 调用前检查是否为
nil:func (u *User) setName(n string) { if u == nil { return // 或 panic("User is nil") } u.Name = n } - 构造函数返回
*User时,也要避免返回未初始化的指针(如var u *User),应显式&User{...}或用new(User) - JSON 解析到结构体指针字段时,若源数据缺失该字段,对应指针字段为
nil,访问前务必判空
字段级指针(比如 Age *int)和结构体指针是两回事,别混淆。这里讨论的是“把结构体地址传进去改它自己”,不是“结构体里存了个指针字段”。
# js
# json
# go
# golang
# 字节
# 为什么
# String
# 构造函数
# Error
# 结构体
# int
# 指针
# Struct
# var
# 值传递
# pointer
# nil
# 的是
# 两种
# 链式
# 多个
# 也要
# 都能
# 不受
# 报错
# 而非
# 改了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
移动端脚本框架Hammer.js
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
如何登录建站主机?访问步骤全解析
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
JavaScript如何实现倒计时_时间函数如何精确控制
如何在香港服务器上快速搭建免备案网站?
如何用wdcp快速搭建高效网站?
简单实现Android文件上传
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何在IIS中新建站点并配置端口与物理路径?
高端建站三要素:定制模板、企业官网与响应式设计优化
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何在万网ECS上快速搭建专属网站?
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
Laravel如何使用Vite进行前端资源打包?(配置示例)
如何彻底删除建站之星生成的Banner?
如何解决hover在ie6中的兼容性问题
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
高端智能建站公司优选:品牌定制与SEO优化一站式服务
Laravel如何实现事件和监听器?(Event & Listener实战)
如何用已有域名快速搭建网站?
C#如何调用原生C++ COM对象详解
Laravel中的withCount方法怎么高效统计关联模型数量
利用 Google AI 进行 YouTube 视频 SEO 描述优化
网站图片在线制作软件,怎么在图片上做链接?
在线教育网站制作平台,山西立德教育官网?
深入理解Android中的xmlns:tools属性
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
HTML 中动态设置元素 name 属性的正确语法详解
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
javascript中的try catch异常捕获机制用法分析
创业网站制作流程,创业网站可靠吗?
如何用PHP工具快速搭建高效网站?
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
Laravel如何使用Eloquent进行子查询
如何在橙子建站中快速调整背景颜色?
Python正则表达式进阶教程_复杂匹配与分组替换解析
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
英语简历制作免费网站推荐,如何将简历翻译成英文?
Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】
如何在阿里云通过域名搭建网站?
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
如何在宝塔面板中修改默认建站目录?
如何快速完成中国万网建站详细流程?
上一篇:Nginx访问限制怎么配置
下一篇:nginx信号集实例分析
上一篇:Nginx访问限制怎么配置
下一篇:nginx信号集实例分析


ice