如何使用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; ?>
】
相关推荐
- 如何在Golang中处理JSON字段缺失_Gola
- Windows电脑如何截屏?(四种快捷方法)
- c++怎么使用类型萃取type_traits_c+
- Win10如何设置双wan路由器 Win10双wa
- Windows10如何删除恢复分区_Win10 D
- Windows执行文件被SmartScreen拦截
- Go 语言标准库为何不提供泛型 Contains
- php订单日志怎么按状态筛选_php筛选不同状态订
- Python对象比较与排序_集合使用说明【指导】
- 如何使用Golang实现错误包装与传递_Golan
- Win11怎么关闭系统透明度_Windows11个
- Ajax提交表单PHP怎么接收_处理Ajax发送的
- Win10闹钟铃声怎么自定义 Win10闹钟自定义
- Win11怎么设置虚拟键盘_打开Win11屏幕键盘
- Mac如何将HEIC图片格式转为JPG_Mac批量
- 如何使用Golang开发基础文件下载功能_Gola
- Windows10如何查看蓝屏日志_Win10使用
- VSC怎样在Linux运行PHP_Ubuntu系统
- 如何在 PHP 单元测试中正确模拟带方法的图像处理
- C#如何使用XPathNavigator高效查询X
- 如何在Golang中捕获HTTP服务器错误_Gol
- php增删改查报错1054怎么办_字段名错误排查修
- Windows10任务栏图标变成白色文件_Win1
- Win11视频默认播放器怎么改_Win11关联第三
- PHP主流架构如何做单元测试_工具与流程【详解】
- 如何在Golang中写入JSON文件_保存结构体数
- php后缀怎么变mp4能播放_让php伪装mp4正
- Win11怎么设置多显示器任务栏 Win11扩展任
- windows 10专注助手怎么关闭_window
- 如何在Golang中使用闭包_封装变量与函数作用域
- Win11关机快捷键是什么_Win11快速关机方法
- mac怎么查看wifi密码_MAC查看已连接WiF
- php错误怎么开启_display_errors与
- Win11时间格式怎么改成12小时制 Win11时
- Win10怎样卸载DockerDesktop_Wi
- Win11怎么更改文件夹图标_自定义Win11文件
- MAC怎么使用表情符号面板_MAC Emoji快捷
- Win10系统更新错误0x80240034怎么办
- 跨文件调用类方法怎么用_php作用域操作符与自动加
- Win10系统映像怎么恢复 Win10使用系统映像
- Windows10如何删除Windows.old_
- c++如何使用std::bitset进行位图算法_
- Win11怎么关闭系统声音_Win11系统提示音静
- Python抽象类与接口设计_规范说明【指导】
- 如何优化Golang Web性能_Golang H
- 如何使用Golang包导出规则_控制函数和变量可见
- Win11怎么更改账户头像_Windows 11自
- Python函数参数高级用法_默认值与可变参数解析
- c# Task.ConfigureAwait(tr
- Python数据挖掘进阶教程_分类回归与聚类案例解

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