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

Go 结构体:值类型 vs. 指针类型的选择与使用

大丽同学_1331

大丽同学_1331

发布时间:2025-07-14 17:14:02

|

915人浏览过

|

来源于php中文网

原创

go 结构体:值类型 vs. 指针类型的选择与使用

本文旨在深入探讨 Go 语言中结构体(struct)的两种访问方式:值类型和指针类型。通过分析 bar 和 barP 结构体的差异,以及结合实际案例(如 invoice 结构体),我们将详细讲解何时应该使用值类型,何时应该使用指针类型,帮助开发者在实际项目中做出更合理的选择。

在 Go 语言中,结构体是复合数据类型,可以包含多个不同类型的字段。访问结构体字段有两种主要方式:通过值类型和通过指针类型。理解这两种方式的差异对于编写高效且健壮的 Go 代码至关重要。

值类型 vs. 指针类型:bar 和 barP 的对比

考虑以下两个结构体定义:

type foo_ struct {
    st uint8
    nd uint8
}

type bar struct {
    rd  uint8
    foo foo_
}

type barP struct {
    rd  uint8
    foo *foo_
}

bar 结构体包含一个 foo_ 类型的字段 foo,这意味着 foo_ 结构体的值直接嵌入到 bar 结构体中。而 barP 结构体包含一个指向 foo_ 类型的指针 foo。 这两种方式的主要区别在于内存分配和共享行为:

  • bar (值类型): 当声明一个 bar 类型的变量时,会同时为 rd 和 foo 分配内存,并将 foo 的值初始化为零值。foo_ 结构体的值始终存在于 bar 结构体中。

    var b bar // 声明 b
    b.foo.st = 10 // 直接访问并修改 foo_ 结构体的字段
  • barP (指针类型): 当声明一个 barP 类型的变量时,会为 rd 和 foo 分配内存,但 foo 的值是一个指向 foo_ 类型的指针,初始值为 nil。 需要额外分配 foo_ 结构体的内存,并将其地址赋值给 foo 字段。

    var bp barP         // 声明 bp
    bp.foo = new(foo_)  // 分配 foo_ 结构体的内存
    bp.foo.st = 10      // 通过指针访问并修改 foo_ 结构体的字段

何时使用值类型?何时使用指针类型?

选择使用值类型还是指针类型取决于具体的应用场景和所需的功能。以下是一些指导原则:

  • 值类型:

    • 数据拥有权: 当结构体拥有其包含的数据的所有权时,应该使用值类型。这意味着结构体负责管理其内部数据的生命周期。
    • 避免共享: 当不希望多个结构体共享相同的数据时,应该使用值类型。每次复制结构体时,都会创建一个新的数据副本。
    • 性能: 对于小型结构体,使用值类型通常比使用指针类型更高效,因为避免了指针的间接引用。
  • 指针类型:

    • 共享数据: 当多个结构体需要共享相同的数据时,应该使用指针类型。通过指针,多个结构体可以指向同一块内存区域。
    • 修改数据: 当需要修改结构体内部的数据,并且希望这些修改对所有共享该数据的结构体可见时,应该使用指针类型。
    • 避免复制: 对于大型结构体,使用指针类型可以避免不必要的内存复制,提高性能。
    • 可选字段: 当结构体中的某个字段是可选的,并且可能不存在时,可以使用指针类型。将指针设置为 nil 表示该字段不存在。

实际案例:invoice 结构体

考虑一个发票(invoice)结构体的例子:

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,因为发货地址是可选的。如果发货地址与账单地址相同,则 shipping 可以为 nil。
  • warehouse 字段使用指针类型 *warehouse,因为多个发票可能共享相同的仓库信息。

注意事项和总结

  • 使用指针类型时,需要注意空指针解引用(nil pointer dereference)的风险。在访问指针指向的字段之前,务必检查指针是否为 nil。
  • 选择值类型还是指针类型是一个重要的设计决策,需要根据具体的应用场景和需求进行权衡。
  • 理解值类型和指针类型的差异对于编写高效、健壮和可维护的 Go 代码至关重要。

通过本文的讲解,相信读者已经对 Go 语言中结构体的值类型和指针类型有了更深入的理解。在实际项目中,根据数据的拥有权、共享需求、修改需求和性能考虑,合理选择值类型和指针类型,可以编写出更优雅和高效的 Go 代码。

热门AI工具

更多
墨刀AI
墨刀AI Hot

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

讯飞智作

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

WorkBuddy

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

DeepSeek

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

Atoms
Atoms Hot

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

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

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

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3371

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

574

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

582

2026.02.12

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

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

5254

2025.06.09

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

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

5431

2025.07.04

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

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

379

2026.04.23

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

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

179

2025.11.16

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

0

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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