2017-08-09 119 views
1

我有不同类型的切片,我需要发送它们与TCP。我的切片长度很大,而不是一个常数值。有什么方法可以将切片转换为[]字节,而无需循环通过各个元素?例如,我想是这样的(假设mySlice元素是4个字节在这里):快速的方式转换类型T的切片,在一个字节切片

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

,但它不会工作,因为4 * len(mySlice)不是一个常数。

谢谢。

+0

你有没有得到它与大小已知的样本工作? – TehSphinX

+0

@TehSphinX,我没有尝试,我不确定这是否是一个好方法,即使知道大小。在我的情况下,需要计算大小,并且事先未知。 – Ari

+0

只是想知道你是否已经解决了第二部分...... – TehSphinX

回答

-1

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

+0

不明原因downvote护理解释? – Adrian

0

所以这是我落得这样做(张贴作为回答我的问题):

import "unsafe" 
import "reflect" 

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

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

我测试了不同的数组大小,它比通过单独的元素循环较好(仅使用unsafe.Pointer)只有当数组足够大时。

+0

从['reflect.SliceHeader'](https://golang.org/pkg/reflect/#SliceHeader)的说明:“它不能安全或可移植地使用,并且其表示可能在以后的版本中发生变化。”这是一个非常脆弱的实现,对读取它的任何其他人来说都是荒谬的 - 为什么不使用像gob这样的适当编码? – Adrian