Go 中的结构体大小

2024-03-27

我正在研究 Go,它看起来很有前途。 我想弄清楚如何获取 go 结构的大小,例如 例如

type Coord3d struct {
    X, Y, Z int64
}

我当然知道它是 24 个字节,但我想以编程方式知道它..

您有任何想法如何做到这一点吗?


罗杰已经展示了如何使用SizeOf https://golang.org/pkg/unsafe/#Sizeof方法从unsafe https://golang.org/pkg/unsafe包裹。请确保在依赖函数返回的值之前阅读此内容:

该大小不包括 x 可能引用的任何内存。为了 例如,如果 x 是切片,则 Sizeof 返回切片的大小 描述符,而不是切片引用的内存的大小。

除此之外,我想解释如何使用几个简单的规则轻松计算任何结构的大小。然后如何使用有用的方法来验证您的直觉service http://golang-sizeof.tips/.


大小取决于它包含的类型以及结构中字段的顺序(因为将使用不同的填充)。这意味着具有相同字段的两个结构可以具有不同的大小。

例如这个结构体将有一个尺寸为32

struct {
    a bool
    b string
    c bool
}

稍加修改就会有尺寸为 24 (a 25%差异只是由于字段排序更紧凑)

struct {
    a bool
    c bool
    b string
}

正如您从图片中看到的,在第二个示例中,我们删除了其中一个填充并移动了一个字段以利用之前的填充。对齐可以是 1、2、4 或 8。填充是用于填充变量以填充对齐的空间(基本上是浪费的空间)。

了解这条规则并记住:

  • bool、int8/uint8 占用 1 个字节
  • int16、uint16 - 2 字节
  • int32、uint32、float32 - 4 字节
  • int64、uint64、float64、指针 - 8 字节
  • 字符串 - 16 字节(2 个 8 字节对齐)
  • 任何切片占用 24 个字节(3 个 8 字节对齐)。所以[]bool, [][][]string是相同的(不要忘记重新阅读我在开头添加的引文)
  • 长度数组n takes n* 类型需要字节数。

有了填充、对齐和字节大小的知识,您可以快速找出如何改进您的结构(但仍然有意义)使用该服务验证您的直觉 http://golang-sizeof.tips/).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go 中的结构体大小 的相关文章

  • 将接口转换为结构体

    type SipField interface Info id name defaultValue string length int type Field string func f Field Get string return str
  • 解码子级时访问嵌套 Codable 结构中父级结构的属性

    在嵌套中使用解码器时Codablestruct 有什么方法可以访问父结构的属性吗 我能想到的唯一可行的方法 尚未测试 是在父结构中也使用手动解码器 在userInfo字典 然后访问userInfo在子结构中 但这会产生大量样板代码 我希望有
  • 重写 ResponseWriter 接口以捕获 HTTP 错误

    我正在用 Go 编写一个 Web 应用程序 虽然各种 mux 库提供了一种设置自定义 404 错误处理程序的方法 但没有任何其他 4xx 和 5xx 错误代码 一个建议是重写 ResponseWriter 接口中的 WriteHeader
  • Security.h 中结构的 macOS 文档

    我正在尝试使用Security h通过 Java 和 JNA 的 macOS 框架 这意味着我需要将某些结构重建为 Java 类 问题是 当我查看文档中的结构时 this one https developer apple com refe
  • Airbrake 抛出错误“pybrake - 错误 - strconv.ParseInt:解析“None”:无效语法”

    我正在尝试按照中描述的步骤在 Django 项目中使用 Airbrake 记录器https github com airbrake pybrake django integration https github com airbrake p
  • Go1编译器如何工作?

    我在一个学校项目中接触 Go 大约一个月了 我注意到 src pkg go 文件夹中的 go ast go token go parser 等包 但是 gc 编译器基于位于 src cmd gc 中的 C 文件 我的问题是关于 Go1 中用
  • 在 Golang Server 中接受持久的 tcp 连接

    我正在尝试使用 Go 并且想创建一个 TCP 服务器 我可以通过 telnet 访问该服务器 发送命令并接收响应 const CONN HOST localhost CONN PORT 3333 CONN TYPE tcp func mai
  • 如何更新任意go结构的所有字符串字段?

    我尝试编写一个函数来更新所有字符串字段随意的结构体 像这样 type Student struct Name string Age int func SetStringField obj interface reflect ValueOf
  • 从头开始使用映像部署无法启动

    我正在使用以下内容构建图像Dockerfile FROM golang 1 19 2 bullseye as builder COPY src src WORKDIR src RUN CGO ENABLED 1 go build race
  • 将数组分配给结构体中的数组

    我正在尝试将一个数组分配给 typedef 结构的一个字段 但实际上找不到一种方法 我已经搜索过这个问题 但我似乎找到的只是 char 数组的答案 这不是我正在寻找的 我只是试图将一个数组分配给一个 int 数组 并寻找一种实用的方法下面的
  • 空或不需要的结构字段

    我有两个结构体 代表将插入到 mongodb 数据库中的模型 一个结构 投资 将另一个结构 集团 作为其字段之一 type Group struct Base Name string json name bson name type Inv
  • 使用私有 git 存储库时的 go 工作区结构

    当你不使用 github 时 我一直在尝试找出 go 代码 工作区的标准文件夹布局 结构 我可以看到如何go get在获取 github 项目时有效 但假设我自己的 git 项目不会有 github com username project
  • 有没有办法以数组的形式访问结构体字段?

    我是 Rust 新手 正在尝试弄清楚这是否可行 因此 有时函数 方法以数组形式访问数据会更干净 有时按名称访问数据会更干净 在 Rust 中我可以定义这样的东西 struct Vector3D x f64 y f64 z f64 coord
  • 为什么Java不支持结构体? (只是出于好奇)

    我知道您可以使用公共字段或其他一些解决方法 或者也许你根本不需要它们 但只是出于好奇为什么 Sun 没有考虑结构 这是一个link http www oracle com technetwork java simple 142616 htm
  • 如何分发仅二进制的 go 包

    我想以二进制形式分发包而不包含源代码 我的演示项目目录结构是这样的 demo greet greet go hi hi go hello hello go main go main go package main import fmt de
  • 如何将 typedef 结构传递给函数?

    此刻我正在努力 void avg everything 但这给了我错误 error subscripted value is neither array nor pointer 当我今天早些时候收到此错误时 这是 因为我没有正确地将 2D
  • IntelliJ 2017.1.2 GOLANG 调试不适用于包中的断点

    我的应用程序由一个 main go 文件和一些包组成 当在 main go 中命中断点时 IntelliJ 按预期工作 显示变量值等 但是 当在不同的包中设置断点时 除了被命中之外 不会显示任何变量 并且不会跳过 进入功能按预期工作 被击中
  • 不带()的sizeof有什么作用? [复制]

    这个问题在这里已经有答案了 作者是这个问题 https stackoverflow com questions 18898410 2 dimensional array simple understanding当我问他什么时 他只是取笑我s
  • 如何使用json传递opentracing数据

    我的 API 网关启动一个跟踪器和一个用于验证电子邮件的范围 然后它传递给user service用于验证 我想通过这个span详情至user service作为 json 对象并启动另一个span as a tracer start sp
  • 在 C 中使用另一个结构中的二维结构数组的编码问题

    我正在使用一个二维结构数组 它是另一个结构的一部分 这不是我做过很多事的事情 所以我遇到了问题 该函数在接近末尾的 测试 for 循环后最终失败 它在出现段错误之前正确打印出一行 我的代码中将数据读入虚拟二维结构数组的部分工作得很好 所以它

随机推荐

  • 波特 油炸的去梗

    为什么波特词干算法在线 http text processing com demo stem http text processing com demo stem stem fried to fri并不是fry 我不记得任何以以下结尾的单词
  • Mjpeg 在最近的 Mobile Safari 上损坏了?

    我正在处理来自 IP 摄像机的实时 mjpeg 流 发现最近发布的 Mobile Safari 似乎对 mjpeg 的支持被破坏了 我正在使用一个带有嵌入图像的简单 HTML 测试页面 如下所示 img src http ip addres
  • 使用流复制文件

    以下示例演示如何使用流复制文件 private void copyWithStreams File aSourceFile File aTargetFile boolean aAppend log Copying files with st
  • Android底部导航视图项目图标大小[重复]

    这个问题在这里已经有答案了 I need to do a bottom navigation view in Android like this I tried and now I have something like this 如何增加
  • 在 Clojure 中实现 cron 类型调度程序

    我正在寻找任何可以在给定时间触发事件的 clojure 方法 例如 我希望一个特定的进程在上午 9 30 启动 然后我可以触发另一个进程在半小时后开始运行 等等 提前致谢 更新2 感谢 arthur ulfeoldt 和 unknown p
  • 是否可以将 Camera2 与 Google Vision API 一起使用

    是否可以仅使用 Camera2 和 Google Vision API 来检测人脸 我找不到整合它的方法 是的 可以将 Camera2 API 与 Google Vision API 一起使用 首先 Google Vision API 人脸
  • 使用 SDK 在 azure 函数中将 Azure blob 存储转换为 JSON

    我正在尝试创建一个计时器触发器 azure 函数 该函数从 blob 获取数据 聚合数据 并将聚合结果放入 cosmosDB 中 我之前尝试使用 azure 函数中的绑定来使用 blob 作为输入 但我被告知这是不正确的 请参阅此线程 Az
  • 如何以编程方式读取 EF DbContext 元数据?

    我有使用 EF CodeFirst 5 的应用程序 dll 版本 4 4 0 0 在 net 4 0 上 我需要能够读取实体元数据 以便我可以针对给定的条目类型获取以下信息 哪些属性是一对多关系 引用实体 哪些属性是多对一关系 引用当前实体
  • 从 SQL Server 中的日期时间字段中获取“日期”

    我有一个日期列 其中日期以格式显示2009 11 18 10 55 28 370 我只想从该值中获取日期 而不是时间 我怎么做 如果您使用的是 SQL Server 2008 则现在有 DATE 数据类型 让它变得更加自然 SELECT C
  • PHP Curl 收到 502:错误网关错误

    在浏览器中 该 url 有效 当我尝试使用 PHP curl 时 我得到了 502 Bad Gateway error 这是我的代码 ch curl init curl setopt ch CURLOPT URL url query str
  • popen vs system:popen 和 system 一样邪恶吗?

    popen 缓冲输出 而系统则不缓冲 这是唯一的区别吗 据我所知 popen 和 system 都通过 shell 运行命令 然而 popen 是evil http www cplusplus com forum articles 1115
  • 使用“using”关键字使继承的构造函数公开[重复]

    这个问题在这里已经有答案了 我正在尝试测试我的类的受保护方法和构造函数 为此 我尝试对其进行子类化 并使用 C 11 将其成员重新导出为 publicusing关键词 class Foo protected Foo int i void r
  • 添加对 CountVectorizer (sklearn) 的词干支持

    我正在尝试使用 sklearn 将词干添加到 NLP 中的管道中 from nltk stem snowball import FrenchStemmer stop stopwords words french stemmer French
  • Keycloak java.lang.NoClassDefFoundError:使用 Springboot 的 java/security/acl/Group

    因此 我们正在构建一个带有 Keycloak 集成的 Spring Boot 后端 但是在 docker swarm 服务上运行后端时出现以下错误 2020 06 29 21 17 51 694 ERROR 1 nio 3304 exec
  • MigraDoc C# 在同一行左右对齐

    我有一个带有单元格的表格 其中我想要两个文本 第一个文本左对齐 第二个文本右对齐 位于同一单元格的同一行上 我尝试使用 MigraDoc 重现此单元 但没有成功 我只能添加左右对齐的两个文本 但不能在同一行上 这是我的代码 Cell cel
  • 在 Python 中向已运行的 cmd 发送命令

    我有一个Python脚本可以绕过Windows中的UAC 绕过用户帐户控制 然后我需要能够以某种方式与打开的 CMD 进行通信并向其传递命令 例如 回声测试 我只能找到打开新命令并与其通信的代码 然而 这并没有帮助 因为我需要与我通过 UA
  • 如何在没有 UDID 的情况下跟踪 iOS5 上的下载

    谁知道如何在没有 UDID 的情况下跟踪 iOS 应用程序下载 通过网络广告 我认为这是不可能的 特别是如果用户从网站转到 AppStore 但一家名为 WDA 的公司似乎使这成为可能 http www lovefortech com 20
  • 无法序列化会话 Bean - 引发警告

    我正在使用 EclipseLink JPA 2 0 在 netbeans 中运行 JSF Primefaces tomcat 6 0 32 的环境 我的应用程序工作正常 但每次运行它时 我都会收到很多警告 指出无法序列化我的会话 bean
  • autovacuum (VACUUM) 是这个 PostgreSQL UPDATE 查询偶尔需要几个小时才能完成运行的原因吗?

    此 sql 查询通常只需要几分钟即可运行 update import parts ip set part manufacturer id pslc part manufacturer id from parts part supplier
  • Go 中的结构体大小

    我正在研究 Go 它看起来很有前途 我想弄清楚如何获取 go 结构的大小 例如 例如 type Coord3d struct X Y Z int64 我当然知道它是 24 个字节 但我想以编程方式知道它 您有任何想法如何做到这一点吗 罗杰已