《Go语言圣经》结构体

《Go语言圣经》结构体

一、结构体指针的高效应用

在处理大型结构体时,为避免内存复制,通常使用指针传递和返回结构体:

// 通过指针传入结构体,避免值拷贝
func Bonus(e *Employee, percent int) int {return e.Salary * percent / 100
}// 必须使用指针才能修改原始结构体数据
func AwardAnnualRaise(e *Employee) {e.Salary = e.Salary * 105 / 100
}

关键点:

  • Go语言函数参数传递均为值拷贝
  • 指针传递避免大数据结构复制开销
  • 修改原结构体必须通过指针实现
二、结构体比较机制

若结构体所有字段均可比较,则该结构体可直接使用==!=比较:

type Point struct{ X, Y int }p := Point{1, 2}
q := Point{2, 1}fmt.Println(p.X == q.X && p.Y == q.Y) // false
fmt.Println(p == q)                   // false (等价写法)

注意事项:

  • 结构体包含不可比较字段(如slice、map)时不可比较
  • 比较操作会递归检查所有字段
三、结构体嵌入机制深度解析
1. 基本嵌入语法

通过匿名字段实现结构体嵌入:

type Point struct{ X, Y float64 }// 嵌入Point结构体
type ColoredPoint struct {Point      // 匿名字段,仅声明类型Color color.RGBA
}// 使用示例
var cp ColoredPoint
cp.X = 1          // 直接访问嵌入字段
cp.Point.X = 1    // 等价访问方式

特性总结:

  • 嵌入类型的所有字段和方法被提升为外部类型
  • 支持直接访问和显式访问两种方式
  • 编译时自动生成访问包装函数
2. 方法"继承"机制

嵌入类型的方法会被自动提升:

// Point类型的方法
func (p Point) Distance(q Point) float64 {return math.Hypot(q.X-p.X, q.Y-p.Y)
}func (p *Point) ScaleBy(factor float64) {p.X *= factorp.Y *= factor
}// ColoredPoint可直接使用Point的方法
var p = ColoredPoint{Point{1,1}, color.RGBA{255,0,0,255}}
var q = ColoredPoint{Point{5,4}, color.RGBA{0,0,255,255}}fmt.Println(p.Distance(q.Point)) // 直接调用Point的方法
p.ScaleBy(2)                     // 支持指针方法

编译器行为:

// 编译器自动生成的包装方法
func (cp ColoredPoint) Distance(q Point) float64 {return cp.Point.Distance(q)
}func (cp *ColoredPoint) ScaleBy(factor float64) {cp.Point.ScaleBy(factor)
}
3. 嵌入与继承的本质区别

Go语言的嵌入实现"has a"关系,而非"is a"关系:

var cp ColoredPoint
var p Pointp = cp        // 错误:类型不兼容
p = cp.Point  // 正确:显式获取嵌入实例p.Distance(q)         // 错误:q不是Point类型
p.Distance(q.Point)   // 正确:显式传递Point字段

关键点:

  • 嵌入不改变类型系统
  • 方法调用需显式匹配参数类型
  • 保持类型独立性,避免继承带来的耦合问题
4. 指针嵌入的高级应用

通过嵌入指针实现数据共享:

type ColoredPoint struct {*Point      // 嵌入指针类型Color color.RGBA
}// 共享同一个Point实例
p := ColoredPoint{&Point{1,1}, red}
q := ColoredPoint{&Point{5,4}, blue}
q.Point = p.Point  // 共享同一实例p.ScaleBy(2)        // 修改会影响所有引用fmt.Println(*p.Point) // 输出: {2 2}
fmt.Println(*q.Point) // 输出: {2 2}

指针嵌入特性:

  • 支持多实例共享底层数据
  • 方法调用自动解引用(p.ScaleBy()等价于(*p.Point).ScaleBy()
  • 适用于需要数据共享的场景
四、最佳实践建议
  1. 大型结构体一律使用指针传递
  2. 需修改原始数据时必须使用指针
  3. 优先使用结构体嵌入而非接口组合复杂类型
  4. 根据数据共享需求选择值嵌入或指针嵌入
  5. 通过显式访问保持类型清晰性,避免命名冲突

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85295.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ascend上如何进行带宽测试

1 工具安装 1.1 下载链接 https://www.hiascend.com/developer/download/community/result?moduledl%2Bcann 1.2 安装指令: ./Ascend-mindx-toolbox_{version}_linux-{arch}.run --install设置环境变量: source /usr/local/Ascend/toolbox/set_env.…

生产BUG集

磁盘达到阈值导致ES无法删除数据 method [POST], host [http://xx.xxx.xxx.xxx:9200], URI [/security_event/_delete_by_query?slices1&requests_per_second-1&ignore_unavailablefalse&expand_wildcardsopen&allow_no_indicestrue&ignore_throttledtru…

基于FastAPI与Selenium的智能开关状态管理系统实践

引言 在工业物联网(IIoT)与自动化控制场景中,设备状态的实时监控与自然语言指令执行是提升效率的关键。本文将介绍一种基于 FastAPI 和 Selenium 的智能设备状态管理系统,通过大语言模型(LLM)解析用户指令…

主体和债项均为“AAA”等级 海尔消金发行10亿金融债

6月18日,继年内发行ABS、落地ESG挂钩银团贷后,海尔消费金融(以下简称“海尔消金”)在金融市场上又迈出重要一步,成功簿记发行2025年首期规模达10亿元金融债,且主体信用等级仍为“AAA”。这一举措为海尔消金…

n8n:轻松自动化您的工作流

借助开源自动化利器 n8n,释放重复劳动的生产力! 引言 n8n 是一款免费、开源的工作流自动化工具,致力于帮助开发者和团队通过连接各种应用和服务,实现重复任务的自动化处理。 它由 Jan Oberhauser 于 2019 年在德国柏林创建&…

Angular--Hello(TODO)

最近有个小错误,因为最近还是在看thingsboard,最近终于看到前端的代码,突然发现怎么全是ts的文件,仔细一看原来并不是之前认为的AngularJS,而是Angular。。。我tm真的无语了,又要去重新学。。。 Angular的…

在 Linux 系统中通过 yum 安装 Sublime Text

在 Linux 系统中通过 yum 安装 Sublime Text 的步骤如下: ​步骤 1:导入 GPG 公钥​ sudo rpm -v --import https://download.sublimetext.com/sublimehq-rpm-pub.gpg 这一步用于验证软件包的合法性。 ​步骤 2:添加 Sublime Text 的软件仓…

面向自主多星对地观测的多智能体强化学习

大家读完觉的有帮助记得及时关注和点赞!!! 抽象 近地轨道 (LEO) 卫星的指数级增长彻底改变了地球观测 (EO) 任务,解决了气候监测、灾害管理等方面的挑战。然而,多卫星系统…

flutter 短视频相关插件选型

​插件名称​​核心优势​​缺点​​短视频场景适用性​​推荐指数​​video_player​ (官方基础库)• 官方维护,跨平台兼容性最佳(iOS/Android/macOS) • 轻量级,无额外依赖,启动速度快 • 支持本地/网络视频、基础播…

QTableView为例:Qt模型视图委托(MVD)(Model-View-Delegate)

文章目录 1. QT中的MVD模式2. View3. Model4. Delegate5. 以TableView为例 1. QT中的MVD模式 模型视图委托(MVD)是Qt中特有的设计模式,类似MVC设计模式,将MVC设计模式中的Controller当做MVD中的Delegate,两者的概念基…

uni-app总结3-项目新建运行调试

一、新建项目 通过HbuilderX新建 在点击工具栏里的文件 -> 新建 -> 项目(快捷键CtrlN,MacOS上是CMD N): 左测Tab选择uni-app类型,输入工程名,选择模板,Vue版本选择3,其他不…

LeetCode 每日一题打卡|若谷的刷题日记 4day--移动零

移动零 题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,1…

简历模板3——数据挖掘工程师5年经验

姓名 / Your Name 数据挖掘工程师 | 5年经验 | 推荐/画像/反欺诈 📞 138-XXXX-XXXX | ✉️ your.emailexample.com | 🌐 github.com/yourname | 📍 北京 🎯 个人简介 / Summary 5年大厂数据挖掘工程经验,硕士学历&am…

Vue添加图片作为水印

直接上代码 把图片作为水印 <div class"info-warp"><div class"image-container"><img src"https://img.shetu66.com/2023/06/28/1687920981963810.png" /><div class"watermark-layer"><imgv-for"…

Conda 常用命令大全:从入门到高效使用

Conda 常用命令大全&#xff1a;从入门到高效使用 Conda 是 Python 生态中最流行的环境管理工具之一&#xff0c;它不仅可以管理 Python 包&#xff0c;还能创建隔离的虚拟环境&#xff0c;适用于数据分析、机器学习、科学计算等场景。本文将介绍 Conda 的常用命令&#xff0c…

【系统更新】TDuckX2.7升级!DSL逻辑、自定义Webhook、AI考试来袭

No.1 支持自定义 DSL 公式 逻辑规则支持自定义 DSL&#xff0c;通过公式表达式构建复杂逻辑条件&#xff0c;能够支持选项、矩阵、自增表单中的内容控制&#xff0c;可以满足多变业务场景&#xff0c;极大提升了逻辑配置的灵活性。 No.2 扩展值新增“名称字段” 在批量生成扩…

安卓9.0系统修改定制化____深入解析安卓 9.0 各手机分区:功能、作用与差异 基础篇二

在安卓 9.0 系统中,手机内部存储被划分为多个不同的分区,每个分区都承担着独特且重要的职责。深入了解这些分区,对于我们理解安卓系统运行机制、进行系统优化,甚至是刷机等操作都有着极大的帮助。尤其是rom定制与修改方面。 通过博文了解💝💝💝 1💝💝💝-----了…

自动驾驶技术路线之争:视觉派、激光雷达派与融合派,谁将引领未来?

自动驾驶的赛道上&#xff0c;科技巨头、传统车企和初创公司纷纷亮出“看家本领”。但你是否注意到&#xff0c;不同玩家的“眼睛”和“大脑”配置大相径庭&#xff1f;特斯拉CEO马斯克曾称“激光雷达是徒劳的拐杖”&#xff0c;而国内华为、小鹏等企业则坚定拥抱激光雷达。这背…

Spring Cloud Alibaba 中间件

Spring Cloud Alibaba 中间件 &#x1f517; Spring官方介绍 [⚠️Spring官方对Spring Cloud Alibaba的更新不及时] &#x1f517; Spring Cloud Alibaba官网 &#x1f4dd; 代码记录 Nacos&#xff08;服务注册与发现&#xff09; Nacos(Dynamic Naming and Configuration…

uniapp+vue中 多次触发onLoad/created

控制台log输出为何频频失踪?   wxss代码为何频频失效?   wxml布局为何乱作一团?   究竟是道德的沦丧?还是人性的缺失?   让我们一起来 走 跑进科学 前言 uniapp中开发网页h5&#xff0c;莫名其妙每次请求接口都会执行两次&#xff0c;仔细排查发现是onLoadonShow…