C ++和其他几种语言都有一个名为sizeof(int)
的函数(或者你需要的任何类型),它返回当前系统中特定数据类型消耗的字节数。
Go中是否有相同的功能?它是什么?
答案 0 :(得分:9)
go中的sizeof
相当于unsafe.Sizeof
。它与C中的sizeof之间的一个区别在于它仅在值上定义(而在C中,它适用于值和类型)。另一个主要区别在于,它几乎不需要,而在C中则相当常见。
一个例子是:
package main
import (
"fmt"
"unsafe"
)
func main() {
fmt.Println(unsafe.Sizeof(int(0)))
}
答案 1 :(得分:6)
如果要查找特定值的大小,有两种方法可以做到这一点 - 使用不安全的软件包或使用反射软件包。以下代码演示了两者:
package main
import (
"fmt"
"reflect"
"unsafe"
)
func main() {
var i int
fmt.Printf("Size of var (reflect.TypeOf.Size): %d\n", reflect.TypeOf(i).Size())
fmt.Printf("Size of var (unsafe.Sizeof): %d\n", unsafe.Sizeof(i))
}
但是,我不知道如何直接获取类型的大小。但我认为你会发现像C一样经常不需要sizeof函数。
答案 2 :(得分:6)
如果您只想查找int
或uint
的尺寸,请使用strconv.IntSize
。
const IntSize = intSize
IntSize
是int
或uint
值的大小。
例如,
package main
import (
"fmt"
"runtime"
"strconv"
)
func main() {
fmt.Println(runtime.Compiler, runtime.GOARCH, runtime.GOOS)
fmt.Println(strconv.IntSize)
}
输出:
gc amd64 linux
64
答案 3 :(得分:2)
不是答案,而是原始问题之后评论主题的延续......
为了实现内存数据集,我会采用以下方法之一:
(简单明了):只使用interface{}
数组来存储行。
接口类型的每个值都是两个指针的元组:指向封闭值的实际类型的指针和值本身。实现是gc
(和gccgo
,我相信)是足够智能的,如果它的大小≤目标平台上uintptr
类型的大小,则直接将值存储在该指针空间中。
(据称更高级):在单独的数据结构(数组或切片)中存储列的类型信息;可以使用reflect
包中的工具获取类型信息。然后将实际数据存储在unsafe.Pointer
数组的行中,并使用gc
中的接口实现与使用/ unsafe.Pointer
类型转换的值相同的技巧。
这样可以通过不存储值的类型以及每个包含的值来提高空间效率。如果有的话,不确定真正的性能优势。