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) // 输出 Alice

方法接收者用 *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失败任务处理与监控  如何在宝塔面板中修改默认建站目录?  如何快速完成中国万网建站详细流程?