如何使用Golang指针与结构体结合_修改结构体内部字段
技术百科
P粉602998670
发布时间:2026-01-01
浏览: 次 在 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))无法修改原结构体字段
不复杂但容易忽略。核心就一条:想改原结构体,函数参数、变量声明、方法接收者,统一用指针类型,并确保操作对象是可寻址的。
# 的是
# 链式
# 也能
# 是从
# 而非
# 关键在于
# 必须先
# go
# golang
# 对象
# String
# 指针
# 报错
# 不改
# 结构体
# Struct
# map
# 指针类型
# 值传递
# golang指针
# 本来就是
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 小程序里php怎么变mp4_小程序调用php生成m
- MySQL 中使用 IF 和 CASE 实现查询字
- 如何在 Go 项目开发中正确处理本地包导入与远程模
- Go语言中CookieJar的持久化机制解析:内存
- c++的static关键字有什么用 静态变量和静态
- SAX解析器是什么,它与DOM在处理大型XML文件
- Windows11怎么自定义任务栏_Windows
- Python并发安全问题_资源竞争说明【指导】
- Win11怎么开启游戏模式_Win11优化游戏帧数
- Win11怎么恢复误删照片_Win11数据恢复工具
- Win10怎样设置闹钟贪睡时间 Win10闹钟贪睡
- c++如何判断文件是否存在_c++ filesys
- Win11怎么关闭键盘按键音_Win11禁用打字声
- PythonWeb前后端整合项目教程_FastAP
- C++中的协变与逆变是什么?C++函数指针与返回类
- Win11怎么更改鼠标指针_Windows 11自
- php怎么操作Redis_Redis扩展连接与基本
- 跨文件调用类方法怎么用_php作用域操作符与自动加
- Windows10系统服务优化指南_Win10禁用
- c++中如何使用std::variant_c++1
- 如何用正则与预处理高效拦截带干扰符的恶意域名
- Win11怎么更改盘符_Win11磁盘管理修改驱动
- Win11怎么更改文件夹图标_自定义Win11文件
- 静态属性修改会影响所有实例吗_php作用域操作符下
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- Mac的Time Machine怎么用_Mac系统
- Windows任务计划服务异常原因_任务调度失败的
- Windows10系统怎么查看显卡驱动_Win10
- windows 10应用商店区域怎么改_windo
- Win11怎么关闭小组件_Win11禁用任务栏天气
- Win11怎么关闭边缘滑动手势_Windows11
- Win10怎样清理C盘阿里旺旺缓存_Win10清理
- 如何在 Go 应用中实现自动错误恢复与进程重启机制
- Windows家庭版如何开启组策略(gpedit.
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- Win11开机速度慢怎么优化_Win11系统启动加
- Windows 11如何查看系统激活密钥_Wind
- Win11无法识别耳机怎么办_解决Win11插耳机
- Win11怎么关闭自动调节亮度_Windows11
- 如何在 Go 开发中正确处理本地包导入与远程模块路
- c++怎么实现大文件的分块读写_c++ 文件指针s
- Win11麦克风没声音怎么设置_Win11麦克风权
- php下载安装后memory_limit怎么设置_
- Win11如何设置自动关机 Win11定时关机命令
- php本地部署后session无法保存_sessi
- 如何在 Pandas 中按元素交集合并两列字符串
- 如何在Golang中编写端到端测试_Golang
- 如何在Golang中写入JSON文件_保存结构体数
- Win11怎么关闭资讯和兴趣_Windows11任
- Python日志系统设计与实现_高可观测性架构实战

string) { u.Name = name }
QQ客服