如何在Golang中修改值类型数据_使用指针改变变量值

发布时间 - 2026-01-10 00:00:00    点击率:
Go中值类型变量函数内不可修改,须传指针;T声明指针类型,&v取地址,p解引用;struct传值改副本,须传Struct;切片是值类型,append扩容需返回或传[]T。

Go 中值类型变量不能被函数内修改,除非传指针

Go 函数参数是值传递,哪怕传的是 intstringstruct 这类值类型,函数内部拿到的也只是副本。原变量不会变。想改原变量,必须传它的地址——也就是指针。

*T&v 是配对操作:取地址和解引用

声明指针类型用 *T(比如 *int),获取变量地址用 &v,通过指针修改值用 *p = x。漏掉 * 或多写 * 都会编译报错或行为异常。

  • &v 返回变量 v 的内存地址,类型是 *T
  • *p 表示“取指针 p 指向的值”,可读可写
  • 声明指针变量时未初始化,值为 nil;解引用 nil 指针会 panic

修改 struct 字段必须传结构体指针,否则改的是副本

struct 是值类型,哪怕它很大,传参时也复制整个结构体。常见错误是定义一个修改字段的函数却传了 struct 本身,结果调用后字段没变。

type User struct {
	Name string
	Age  int
}

func updateUser(u User) { // ❌ 错误:u 是副本
	u.Name = "Alice"
	u.Age = 30
}

func updateUserPtr(u *User) { // ✅ 正确:u 指向原变量
	u.Name = "Alice"
	u.Age = 30
}

func main() {
	u := User{Name: "Bob", Age: 25}
	updateUser(u)      // u 不变
	updateUserPtr(&u)  // u.Name 变成 "Alice"
}

切片、map、channel 是引用类型,但底层数组仍需注意指针语义

切片本身是值类型(含 pointer、len、cap 三个字段),所以传切片不等于传底层数组指针。若函数内做了 append 导致扩容,新底层数组不会反映到原切片上。需要返回新切片或传 *[]T 才能保证修改生效。

  • 只修改已有元素(如 s[0] = x):无需指针,因为 pointer 字段指向同一数组
  • 追加元素且可能扩容(append(s, x)):原切片变量不变,必须用返回值或 *[]T
  • 想让函数能重分配底层数组并更新原变量,得传 *[]int,再用 *s = append(*s, x)
真正容易忽略的是:即使你用了指针,如果中间经过多次赋值或 channel 发送,指针值可能被复制,而你误以为还在操作原地址。每次传递指针前,确认它是否仍指向你期望的那个变量。


# go  # golang  # app  # ai  # String  # 结构体  # int  # 指针  # 值类型  # 引用类型  # 指针类型  # Struct  # 值传递  # pointer  # 切片  # len  # cap  # nil  # append  # map  # channel  # 的是  # 还在  # 已有  # 用了  # 这类  # 想让  # 再用  # 报错  # 而你  # 不等于 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python3.6正式版新特性预览  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  PHP正则匹配日期和时间(时间戳转换)的实例代码  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  企业网站制作这些问题要关注  Swift中循环语句中的转移语句 break 和 continue  🚀拖拽式CMS建站能否实现高效与个性化并存?  如何在Ubuntu系统下快速搭建WordPress个人网站?  *服务器网站为何频现安全漏洞?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Android自定义控件实现温度旋转按钮效果  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel怎么实现验证码(Captcha)功能  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  详解Huffman编码算法之Java实现  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  Java垃圾回收器的方法和原理总结  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  微信小程序 require机制详解及实例代码  如何挑选优质建站一级代理提升网站排名?  详解jQuery停止动画——stop()方法的使用  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  免费视频制作网站,更新又快又好的免费电影网站?  如何快速建站并高效导出源代码?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  网站建设要注意的标准 促进网站用户好感度!  Laravel如何生成API文档?(Swagger/OpenAPI教程)  如何为不同团队 ID 动态生成多个“认领值班”按钮  如何在阿里云通过域名搭建网站?  独立制作一个网站多少钱,建立网站需要花多少钱?  js实现点击每个li节点,都弹出其文本值及修改  Android GridView 滑动条设置一直显示状态(推荐)  免费网站制作appp,免费制作app哪个平台好?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  高性价比服务器租赁——企业级配置与24小时运维服务  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  创业网站制作流程,创业网站可靠吗?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  如何快速搭建高效简练网站?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  清除minerd进程的简单方法