0

0

如何使用Golang的结构体_Golang结构体定义与实例化技巧

P粉602998670

P粉602998670

发布时间:2026-02-03 13:33:10

|

943人浏览过

|

来源于php中文网

原创

Go结构体通过导出性、嵌入、JSON tag和初始化规则实现抽象:小写字段不可导出且JSON忽略,大写字母开头才可映射;嵌入非继承,仅字段提升;必须用键值或全顺序初始化;内存布局影响性能与比较。

如何使用golang的结构体_golang结构体定义与实例化技巧

Go 结构体不是类,没有继承和方法重载,但通过组合和接口能实现更清晰的抽象——定义不当会直接导致内存浪费、序列化失败或嵌入行为异常。

结构体字段首字母大小写决定导出性

小写字母开头的字段(如 name)在包外不可见,JSON 反序列化时会被忽略,json.Unmarshal 无法赋值;大写字母开头(如 Name)才可被外部访问和自动映射。

  • 想让字段参与 JSON 编解码,必须导出:用 Name 而非 name
  • 需要私有字段但又想控制 JSON 行为?加 tag:Name string `json:"name"`
  • 完全排除某字段:用 - tag,如 Password string `json:"-"`
  • 嵌入结构体时,若嵌入的是未导出结构体(如 type user struct{...}),其字段不会被提升到外层结构体中

嵌入结构体(Anonymous Field)不是继承

嵌入 type User struct{ ID int }type Admin struct{ User } 后,Admin 可直接访问 ID,但这只是字段提升(field promotion),不是类型继承——AdminUser 之间没有类型兼容关系。

  • var a Admin; a.ID = 123 合法,但 func f(u User) {};f(a) 编译失败
  • 若需类型兼容,应显式声明字段名:User User,或用接口抽象行为
  • 多个嵌入结构体含同名字段(如都含 ID),则必须用全路径访问:a.User.IDa.Profile.ID
  • 嵌入指针类型(*User)可避免零值拷贝,也支持 nil 安全判断

结构体字面量初始化必须按字段顺序或使用键值对

省略字段名时,Go 要求按定义顺序提供值;一旦用了任一键(如 Name:),就必须全部用键,否则编译报错 missing field 'Name' in struct literal

速创猫AI简历
速创猫AI简历

一键生成高质量简历

下载

立即学习go语言免费学习笔记(深入)”;

  • 正确(顺序):u := User{1, "Alice"}
  • 正确(键值):u := User{ID: 1, Name: "Alice"}
  • 错误(混用):u := User{1, Name: "Alice"} → 编译失败
  • 字段多时推荐键值写法:避免顺序错位、提升可读性、支持部分初始化
  • 嵌入结构体的字面量中,嵌入类型名可省略,但仅限于无名嵌入;若有名嵌入(U User),必须写 U: User{...}

结构体比较与内存布局影响性能

结构体默认支持 == 比较,但前提是所有字段都可比较(不能含 mapfuncslice 等);同时,字段排列顺序直接影响内存对齐和 GC 压力。

  • 含不可比较字段(如 data map[string]int)的结构体无法用 ==,需手写 Equal() 方法
  • 把大字段(如 []byte)放在结构体末尾,减少因对齐产生的填充字节
  • 频繁创建小结构体(如 type Point {X, Y int64})建议保持紧凑;含指针字段的结构体,GC 需扫描整个实例,注意逃逸分析结果
  • 不确定是否要比较?优先用指针传参 + 显式比较逻辑,而非依赖结构体默认相等性

结构体本身不复杂,但字段可见性、嵌入语义、初始化约束和内存特性这四点,任意一个疏忽都会在后期引发难以调试的行为偏差——尤其是跨包使用和序列化场景下,别只看能不能跑通,要看字段是不是真被看见、真被复制、真被释放。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

184

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

230

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

344

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

397

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

282

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

194

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

540

2025.06.17

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

0

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.8万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号