如何使用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; ?>
】
相关推荐
- MAC怎么用连续互通相机里的“桌上视角”_MAC在
- php中常量能用::访问吗_类常量与作用域操作符使
- Win11开机Logo怎么换_Win11自定义启动
- Linux怎么修改用户密码_Linux系统pass
- 如何使用Golang处理静态文件缓存_提高页面加载
- Win11讲述人怎么关闭_Win11误触开启语音朗
- Win10如何备份注册表_Win10注册表备份步骤
- Win11蓝牙开关不见了怎么办_Win11蓝牙驱动
- Python文件管理规范_工程实践说明【指导】
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Win11如何更改用户账户文件夹名称 Win11修
- php打包exe后无法写入文件_权限问题解决方法【
- Win10路由器怎么隐藏ssid Win10隐藏w
- PHP 中如何在函数内持久修改引用变量所指向的目标
- php转mp4怎么设置帧率_调整php生成mp4视
- Win10如何更改任务栏高度_Windows10解
- php嵌入式日志记录怎么实现_php将硬件数据写入
- Win11如何设置计划任务 Win11定时执行程序
- 怎么将XML数据可视化 D3.js加载XML
- Win11开机速度慢怎么优化_Win11系统启动加
- Python大文件处理策略_内存优化说明【指导】
- Win11怎么关闭资讯和兴趣_Windows11任
- 使用类变量定义字符串常量时的类型安全最佳实践
- 如何在 Windows 11 中使用 AlomWa
- WindowsUSB驱动安装异常怎么办_USB驱动
- Win10怎么卸载金山毒霸_Win10彻底卸载金山
- Win11怎么关闭边缘滑动手势_Windows11
- Python爬虫项目实战教程_Scrapy抓取与存
- C#如何使用XPathNavigator高效查询X
- php本地部署后session无法保存_sessi
- c# 如何用c#实现一个支持优先级的任务队列
- Win11屏幕亮度突然变暗怎么解决_自动变暗问题处
- Win11怎么开启窗口对齐助手_Windows11
- Windows 11无法安全删除U盘提示设备正在使
- Mac如何调整Dock栏大小和位置_Mac程序坞个
- 如何用正则与预处理高效拦截带干扰符的恶意域名
- php485读数据时阻塞怎么办_php485非阻塞
- php中::能用于接口静态方法吗_接口静态方法调用
- 短链接怎么自定义还原php_修改解码规则适配需求【
- Windows 11怎么更改锁屏超时时间_Wind
- Windows如何使用注册表查找和删除项?(reg
- Python并发安全问题_资源竞争说明【指导】
- Win11怎么开启远程桌面_Win11系统远程桌面
- Win11怎么设置快速访问_Windows11文件
- c++中explicit(bool)的用法 c++
- Python文件和流处理指南_高效读写大体积数据文
- 如何使用Golang开发简单的聊天室消息存储_Go
- Mac怎么给文件夹加密_Mac创建加密磁盘映像教程
- Win11怎么设置闹钟_Windows 11时钟应
- Win11怎么查看局域网电脑_Windows 11

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