将T类型的片段转换为Go中的一个字节片段的快速方法

时间:2017-08-09 17:08:49

标签: go tcp unsafe-pointers

我有不同类型的切片,我需要用TCP发送它们。我的切片长度很大,而不是一个恒定的值。有没有什么方法可以将切片转换为[]字节而不循环通过单个元素?例如,我想要这样的东西(假设mySlice元素在这里是4字节):

byteSlice := (*[4 * len(mySlice)]byte)(unsafe.Pointer(&mySlice[0]))

但它不起作用,因为4 * len(mySlice)不是常量。

谢谢。

2 个答案:

答案 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,这不需要长度为常量。创建数组时,长度必须是常量,因为您要创建一个必须在编译时可解析的未命名类型。

相关问题