For this kind of task, I think that your first parameters should always use encoding/binary and, if that is not enough, bitwise math. However, in some cases, the overhead of copying data is too high or these secure solutions are too slow:
Until I call it elegant, you can use Go unsafe and reflect * to do this very quickly. Just remember that this does not copy data; rather, it just gives you another βlookβ at it. And being good at risk means that you need to be very careful (see Unit Tests and Code Overview), and keep in mind that you are violating Go memory security . However, when execution speed is the dominant task and your team agrees with unsafe , unsafe can rarely be beaten.
const BYTES_IN_INT32 = 4 func UnsafeCaseInt32ToBytes(val int32) []byte { hdr := reflect.SliceHeader{Data: uintptr(unsafe.Pointer(&val)), Len: BYTES_IN_INT32, Cap: BYTES_IN_INT32} return *(*[]byte)(unsafe.Pointer(&hdr)) } func UnsafeCastInt32sToBytes(ints []int32) []byte { length := len(ints) * BYTES_IN_INT32 hdr := reflect.SliceHeader{Data: uintptr(unsafe.Pointer(&ints[0])), Len: length, Cap: length} return *(*[]byte)(unsafe.Pointer(&hdr)) }
* Note. You can use SizeOf , not a constant. I like the constant better.
Update: here are some test results:
BenchmarkB2 20000000 88.7 ns/op BenchmarkB4 5000000 309 ns/op BenchmarkUnsafe 1000000000 2.25 ns/op
voidlogic
source share