0

0

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

DDD

DDD

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

|

522人浏览过

|

来源于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 会导致空指针引用错误。

PageGen
PageGen

AI页面生成器,支持通过文本、图像、文件和URL一键生成网页。

下载

何时使用值类型 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助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

220

2025.06.09

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

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

192

2025.07.04

treenode的用法
treenode的用法

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

538

2023.12.01

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

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

17

2025.12.22

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

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

26

2026.01.06

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

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

22

2025.11.16

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

24

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

7

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

28

2026.01.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

光速学会docker容器
光速学会docker容器

共33课时 | 1.9万人学习

时间管理,自律给我自由
时间管理,自律给我自由

共5课时 | 0.8万人学习

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

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