【问题标题】:Is there a way to compute sizeof a type in golang? [duplicate]有没有办法在golang中计算类型的大小? [复制]
【发布时间】:2020-10-04 01:56:42
【问题描述】:

https://dlintw.github.io/gobyexample/public/memory-and-sizeof.html

它展示了如何计算变量的大小。但我想计算一个类型的 sizeof(例如,'uint32')。有没有办法在 Go 中这样做。

【问题讨论】:

  • 没有。 reflect 可以检查类型,但必须从具体值开始。通常,如果框架想要使用某种类型,调用者会使用该类型的零值注册,例如gob.Register.
  • 你能告诉我们你为什么要这样做吗?我问是因为 Go 有特定的理由在 unsafe 包中包含 Sizeof

标签: go


【解决方案1】:

使用Type.Size 获取类型的大小。

t := reflect.TypeOf((*uint32)(nil)).Elem()
fmt.Println(t.Size())  // prints 4

表达式reflect.TypeOf((*X)(nil)).Elem() 获取任何类型Xreflect.Type

对于uint32等数值类型,可以使用更简单的表达式reflect.TypeOf(uint32(0))来获取类型。

unsafe.Sizeof 函数也可以工作,但它需要一个类型的值。

fmt.Println(unsafe.Sizeof(uint32(0)))  // prints 4

【讨论】:

  • 从技术上讲,这仍在评估类型的值。
  • @colm.anseo 表达式reflect.TypeOf((*someType)(nil)).Elem() 确实评估someType 的值。它确实评估了*someType
  • someType的指针。内存指针占用空间。它是nil 的事实并没有改变它是一个值(占用 8 个字节)的事实。
  • @colm.anseo 使用reflect.TypeOf((*X)(nil)).Elem() 的目的是为了语法。该语法适用于任何类型X。该语法还避免了在堆栈上分配任意大的值。
  • (如果你没有每隔一天创建一个新帐户,提供反馈会更容易,例如onetwothreefour,@987654328 @、sixseveneight???)
猜你喜欢
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
相关资源
最近更新 更多