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

将T型片转换为Go中字节片的快速方法,go,tcp,unsafe-pointers,Go,Tcp,Unsafe Pointers,我有不同类型的切片,我需要用TCP发送它们。我的切片长度很大,不是一个常量值。是否有任何方法可以将切片转换为[]字节,而无需在单个元素之间循环?例如,假设mySlice元素在这里是4个字节,我想要这样的东西: byteSlice := (*[4 * len(mySlice)]byte)(unsafe.Pointer(&mySlice[0])) 但它不起作用,因为4*lenmySlice不是常数 谢谢。在示例代码中,您创建的是数组,而不是切片,因此出现了错误。要创建特定长度的切片,请使用

我有不同类型的切片,我需要用TCP发送它们。我的切片长度很大,不是一个常量值。是否有任何方法可以将切片转换为[]字节,而无需在单个元素之间循环?例如,假设mySlice元素在这里是4个字节,我想要这样的东西:

byteSlice := (*[4 * len(mySlice)]byte)(unsafe.Pointer(&mySlice[0]))
但它不起作用,因为4*lenmySlice不是常数


谢谢。

在示例代码中,您创建的是数组,而不是切片,因此出现了错误。要创建特定长度的切片,请使用,它不要求长度为常量。创建数组时,长度必须是常量,因为您正在创建一个未命名的类型,该类型必须在编译时解析。

因此,我最后将其作为问题的答案发布:

import "unsafe"
import "reflect"   

mySliceR := *(*reflect.SliceHeader)(unsafe.Pointer(&mySlice))
mySliceR.Len *= mySliceElemSize
mySliceR.Cap *= mySliceElemSize

byteSlice := *(*[]byte)(unsafe.Pointer(&mySliceR))

我针对不同的数组大小对其进行了测试,这比仅在数组足够大的情况下使用不安全的指针遍历单个元素要好。

您是否让它用于已知大小的示例?@TehSphinX,我没有尝试过,即使已知大小,我也不确定这是否是一种好方法。在我的例子中,大小需要计算,而且总是事先未知的。当然,我不知道细节,但似乎您最好使用protobuf或类似的东西序列化数据。发送组成某些Go类型的原始字节是不可移植的。或者,它比protobuf更有效,但灵活性和互操作性较差。它不应该工作。在围棋中乱动记忆不是一个好的练习。请改用一些序列化包来执行此操作。不安全强制转换带来的性能提升无法证明这可能会导致内存泄漏/损坏。从的描述来看:它不能安全或可移植地使用,其表示形式可能会在以后的版本中更改。这是一个非常脆弱的实现,对于任何阅读它的人来说都是毫无意义的——为什么不使用像gob这样的正确编码呢?