Closed kawasin73 closed 5 years ago
一つ一つの値を変換する場合はバイト列の長さに応じて変換計算コストが必要になり、また大量のメモリコピーが発生する。
ゼロコピーでこの変換を実現するには C 言語のようなキャストが必要である。
これには、reflect
パッケージと unsafe
パッケージを利用する
https://stackoverflow.com/questions/11924196/convert-between-slices-of-different-types
import (
"reflect"
"unsafe"
)
const SIZEOF_INT32 = 4 // bytes
// Get the slice header
header := *(*reflect.SliceHeader)(unsafe.Pointer(&raw))
// The length and capacity of the slice are different.
header.Len /= SIZEOF_INT32
header.Cap /= SIZEOF_INT32
// Convert slice header to an []int32
data := *(*[]int32)(unsafe.Pointer(&header))
[]byte
から[]uint64
への変換方法を調査する