为了账号安全,请及时绑定邮箱和手机立即绑定

切片内容的大小(以字节为单位)

切片内容的大小(以字节为单位)

Go
慕尼黑的夜晚无繁华 2021-05-11 17:37:26
我正在尝试向OpenGl发送一些数据。由于Sizeof,发送数组很容易:array := [...]Whatever {lots of data}array_ptr := gl.Pointer(&array[0])array_size := gl.Sizeiptr(unsafe.Sizeof(array))gl.BufferData(gl.ARRAY_BUFFER, array_size, array_ptr, gl.STATIC_DRAW)我想使用切片而不是数组,因为3D模型的大小在编译时未知。如何获取切片内容的大小(以字节为单位)? 我想到了这一点:size := uintptr(len(slice)) * unsafe.Sizeof(slice[0])但这不是很笼统。的确,我需要知道切片的基础类型才能使它起作用,并且这假定数组的所有元素都具有相同的大小。我还可以遍历整个切片,并添加每个元素的所有大小。这不是很快。我准备随时保持镜头==上限,这对我有帮助吗?编辑:使用运行时反射实现建议的解决方案package mainimport "fmt"import "reflect"func ElemSize(container interface{}) uintptr {    return reflect.TypeOf(container).Elem().Size()}func ElemSizeVerbose(container interface{}) uintptr {    t := reflect.TypeOf(container)    e := t.Elem()    s := e.Size()    fmt.Println(t, e, s)    return s}func main() {    a := [...]int8{2, 3, 5, 7, 11} // Array    s := []int64{2, 3, 5, 7, 11} // Slice    z := []int32{} // Even empty things    ElemSizeVerbose(a) // [5]int8 int8 1    ElemSizeVerbose(s) // []int64 int64 8    ElemSizeVerbose(z) // []int32 int32 4}
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

在切片或数组中,每个元素的大小始终相同。因此,只要 len(s) > 0,您的示例就可以工作。换句话说,只要切片中至少有一个元素。否则会惊慌。

为了避免切片中包含元素,我建议使用以下内容:

 uintptr(len(s)) * reflect.TypeOf(s).Elem().Size()


查看完整回答
反对 回复 2021-05-31
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

您可以使用编码/二进制包的(大小)。


package main


import (

    "encoding/binary"

    "fmt"

)


func main() {

    a := [...]int8{2, 3, 5, 7, 11} // Array

    s := []int64{2, 3, 5, 7, 11}   // Slice

    z := []int32{}                 // Even empty things


    fmt.Println(binary.Size(a)) // 5

    fmt.Println(binary.Size(s)) // 40

    fmt.Println(binary.Size(z)) // 0

}


查看完整回答
反对 回复 2021-05-31
  • 2 回答
  • 0 关注
  • 252 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信