讲师中心 微信公众号
AI工具推荐 视频效率加速

Go 结构体:值类型 vs. 指针类型的嵌套

大丽同学_1331

大丽同学_1331

发布时间:2025-07-14 18:22:15

|

542人浏览过

|

来源于php中文网

原创

go 结构体:值类型 vs. 指针类型的嵌套

本文旨在深入探讨 Go 语言中结构体嵌套时,使用值类型和指针类型的区别。通过示例代码和详细解释,帮助读者理解两种方式的内存管理、共享特性以及适用场景,从而在实际开发中做出更合理的选择。

在 Go 语言中,结构体嵌套是构建复杂数据结构的常用方式。当一个结构体包含另一个结构体时,我们可以选择使用值类型或指针类型来嵌入。这两种方式在内存管理、数据共享等方面存在显著差异,理解这些差异对于编写高效、健壮的 Go 程序至关重要。

值类型嵌套

当一个结构体 bar 嵌入另一个结构体 foo_ 的值类型时,bar 结构体实例会包含 foo_ 结构体实例的完整副本。这意味着,bar 结构体实例在内存中分配空间时,也会为 foo_ 结构体实例分配空间。

type foo_ struct {
    st uint8
    nd uint8
}

type bar struct {
    rd  uint8
    foo foo_
}

var b bar  // 声明 b

上述代码中,bar 类型的变量 b 在声明时,会同时为 rd 和 foo 字段分配内存。foo 字段是 foo_ 结构体的一个完整副本。修改 b.foo 中的字段不会影响其他任何 foo_ 结构体实例。

指针类型嵌套

当一个结构体 barP 嵌入另一个结构体 foo_ 的指针类型时,barP 结构体实例只包含指向 foo_ 结构体实例的指针。这意味着,barP 结构体实例本身并不拥有 foo_ 结构体实例的内存空间。

type foo_ struct {
    st uint8
    nd uint8
}

type barP struct {
    rd  uint8
    foo *foo_
}

var bp barP         // 声明 bp
bp.foo = new(foo_)  // 分配 bp.foo 指向的内存

上述代码中,barP 类型的变量 bp 在声明时,会为 rd 和 foo 字段分配内存。但是,foo 字段仅仅是一个指向 foo_ 结构体的指针,其初始值为 nil。在使用 bp.foo 之前,必须使用 new(foo_) 或其他方式为 foo_ 结构体实例分配内存,并将指针赋值给 bp.foo。

重要提示: 如果没有为 bp.foo 分配内存,直接访问 bp.foo 会导致空指针引用错误。

何时使用值类型 vs. 指针类型

选择使用值类型还是指针类型取决于具体的需求和场景。

  • 值类型:

    • 当需要拥有结构体实例的独立副本时。
    • 当结构体实例较小,复制成本不高时。
    • 当希望避免多个结构体实例共享同一份数据时。
  • 指针类型:

    • 当需要多个结构体实例共享同一份数据时。
    • 当结构体实例较大,复制成本较高时。
    • 当需要在函数内部修改结构体实例,并希望修改能够反映到函数外部时。
    • 当结构体实例可能为空时(可以使用 nil 指针表示)。

示例:发票系统

考虑一个发票系统,其中包含账单地址和送货地址。

type address struct {
    street string
    city   string
}

type warehouse struct {
    address string
}

type invoice struct {
    name      string
    billing   address
    shipping  *address
    warehouse *warehouse
}

在这个例子中:

  • billing 字段使用值类型 address,因为每张发票都必须有一个账单地址,并且账单地址是发票的固有属性。
  • shipping 字段使用指针类型 *address,因为送货地址可能与账单地址相同,也可能不同。如果送货地址为空,则表示送货地址与账单地址相同。
  • warehouse 字段使用指针类型 *warehouse,因为公司可能只有几个仓库,多个发票可以共享同一个仓库的信息,避免重复存储。

总结

在 Go 语言中,结构体嵌套时选择值类型或指针类型,需要根据实际情况进行权衡。值类型提供数据的独立性,而指针类型提供数据的共享和灵活性。理解它们的区别,可以帮助我们编写更高效、更健壮的 Go 程序。 记住,选择合适的类型可以提高代码的可读性和可维护性,并避免潜在的错误。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

相关专题

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

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

5234

2025.06.09

golang结构体方法
golang结构体方法

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

5411

2025.07.04

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2801

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

396

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

437

2026.01.06

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

492

2026.05.09

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

179

2025.11.16

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Postman安装指南
Postman安装指南

共0课时 | 0人学习

DBeaver生态工具dbvr官方手册
DBeaver生态工具dbvr官方手册

共0课时 | 0人学习

DBeaver事务控制指南
DBeaver事务控制指南

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn