我有不同类型的切片,我需要用TCP发送它们。我的切片长度很大,而不是一个恒定的值。有没有什么方法可以将切片转换为[]字节而不循环通过单个元素?例如,我想要这样的东西(假设mySlice元素在这里是4字节):
byteSlice := (*[4 * len(mySlice)]byte)(unsafe.Pointer(&mySlice[0]))
但它不起作用,因为4 * len(mySlice)
不是常量。
谢谢。
答案 0 :(得分:0)
所以这就是我最终做的事情(将其作为我的问题的答案发布):
import "unsafe"
import "reflect"
mySliceR := *(*reflect.SliceHeader)(unsafe.Pointer(&mySlice))
mySliceR.Len *= mySliceElemSize
mySliceR.Cap *= mySliceElemSize
byteSlice := *(*[]byte)(unsafe.Pointer(&mySliceR))
我测试了它的不同数组大小,并且只有当数组足够大时才能循环遍历各个元素(仅使用unsafe.Pointer)。
答案 1 :(得分:-1)
在您的示例代码中,您要创建数组,而不是切片,因此会出错。要创建特定长度的切片,请使用make
,这不需要长度为常量。创建数组时,长度必须是常量,因为您要创建一个必须在编译时可解析的未命名类型。