字节数组大小 golang

32

我有一个 []byte 对象,想要得到它的字节大小。在 Golang 中是否有类似于 C 语言 sizeof() 的功能?如果没有,你能否提供其他方法来获得相同的结果?


1
你想要长度、容量还是内存大小?它们可能都不同。 - JimB
不,len给出的是数组中对象的数量,而不是整个数组以字节为单位的大小。我猜@evanmcdonnal说得对。 - sr_149
1
@sr_149:你不能使用binary.Size来获取数组的大小,你需要使用length * data_type_size。这可能是你想要的,但请记住,数组的大小(容量)通常是不同的。 - JimB
@evanmcdonnal:不,我不是。我仔细选择了我的措辞,并且问题是关于一个切片[]byte),其中容量是底层数组的大小;__在切片结构体中指向字段array数组__。与C语言的sizeof最接近的等效物将返回整个数组的分配大小,而不是您正在使用的部分。 - JimB
@JimB 我没有将问题看作在这两者之间做出选择,但我猜测所使用的语法在技术上是一个切片。在大多数情况下,容量可能并不是期望的值。如果你确实希望得到那个值,你应该自己编写一个方法,它执行 cap(bytes) * unsafe.Sizeof(bytes[0]) 的操作。 - evanmcdonnal
显示剩余3条评论
2个回答

34

要返回字节切片中的字节数,请使用 len 函数:

bs := make([]byte, 1000)
sz := len(bs)
// sz == 1000

如果你是指底层数组中的字节数,请使用cap

bs := make([]byte, 1000, 2000)
sz := cap(bs)
// sz == 2000

一个字节一定是一个字节:https://golang.org/ref/spec#Size_and_alignment_guarantees


谢谢@Caleb,godoc确实帮助我更清楚地理解了! - sr_149

11

我认为你最好的选择是:

package main

import "fmt"
import "encoding/binary"

func main() {
    thousandBytes := make([]byte, 1000)
    tenBytes := make([]byte, 10)
    fmt.Println(binary.Size(tenBytes))
    fmt.Println(binary.Size(thousandBytes))
}

虽然有很多选项,比如只导入unsafe并使用sizeof;

https://play.golang.org/p/HhJif66VwY

import unsafe "unsafe"

size := unsafe.Sizeof(bytes)

请注意,对于某些类型,如切片,Sizeof将会给出切片描述符的大小,这可能不是您想要的。此外,请记住切片的长度和容量是不同的,并且binary.Size返回的值反映了长度。


1
使用Sizeof获取切片描述符的大小不仅容易,而且您只能获取描述符的大小,该大小始终为3个字。 - JimB
谢谢!:D 我将使用 encoding/binary 包。 - sr_149
@JimB 是的,但如果OP正在处理字节数组,则它有效;https://play.golang.org/p/UQUcQYC9F3就个人而言,我认为二进制软件包更好,因为它不会给您切片描述符大小,但OP确实要求等效的sizeof是unsafe.Sizeof。 - evanmcdonnal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接