2017-08-09 39 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