我有不同類型的切片,我需要發送它們與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