我有不同类型的切片,我需要发送它们与TCP。我的切片长度很大,而不是一个常数值。有什么方法可以将切片转换为[]字节,而无需循环通过各个元素?例如,我想是这样的(假设mySlice元素是4个字节在这里):快速的方式转换类型T的切片,在一个字节切片
byteSlice := (*[4 * len(mySlice)]byte)(unsafe.Pointer(&mySlice[0]))
,但它不会工作,因为4 * len(mySlice)
不是一个常数。
谢谢。
我有不同类型的切片,我需要发送它们与TCP。我的切片长度很大,而不是一个常数值。有什么方法可以将切片转换为[]字节,而无需循环通过各个元素?例如,我想是这样的(假设mySlice元素是4个字节在这里):快速的方式转换类型T的切片,在一个字节切片
byteSlice := (*[4 * len(mySlice)]byte)(unsafe.Pointer(&mySlice[0]))
,但它不会工作,因为4 * len(mySlice)
不是一个常数。
谢谢。
所以这是我落得这样做(张贴作为回答我的问题):
import "unsafe"
import "reflect"
mySliceR := *(*reflect.SliceHeader)(unsafe.Pointer(&mySlice))
mySliceR.Len *= mySliceElemSize
mySliceR.Cap *= mySliceElemSize
byteSlice := *(*[]byte)(unsafe.Pointer(&mySliceR))
我测试了不同的数组大小,它比通过单独的元素循环较好(仅使用unsafe.Pointer)只有当数组足够大时。
从['reflect.SliceHeader'](https://golang.org/pkg/reflect/#SliceHeader)的说明:“它不能安全或可移植地使用,并且其表示可能在以后的版本中发生变化。”这是一个非常脆弱的实现,对读取它的任何其他人来说都是荒谬的 - 为什么不使用像gob这样的适当编码? – Adrian
你有没有得到它与大小已知的样本工作? – TehSphinX
@TehSphinX,我没有尝试,我不确定这是否是一个好方法,即使知道大小。在我的情况下,需要计算大小,并且事先未知。 – Ari
只是想知道你是否已经解决了第二部分...... – TehSphinX