github.com/cybriq/giocore@v0.0.7-0.20210703034601-cfb9cb5f3900/internal/byteslice/byteslice.go (about) 1 // SPDX-License-Identifier: Unlicense OR MIT 2 3 // Package byteslice provides byte slice views of other Go values such as 4 // slices and structs. 5 package byteslice 6 7 import ( 8 "reflect" 9 "unsafe" 10 ) 11 12 // Struct returns a byte slice view of a struct. 13 func Struct(s interface{}) []byte { 14 v := reflect.ValueOf(s).Elem() 15 sz := int(v.Type().Size()) 16 var res []byte 17 h := (*reflect.SliceHeader)(unsafe.Pointer(&res)) 18 h.Data = uintptr(unsafe.Pointer(v.UnsafeAddr())) 19 h.Cap = sz 20 h.Len = sz 21 return res 22 } 23 24 // Uint32 returns a byte slice view of a uint32 slice. 25 func Uint32(s []uint32) []byte { 26 n := len(s) 27 if n == 0 { 28 return nil 29 } 30 blen := n * int(unsafe.Sizeof(s[0])) 31 return (*[1 << 30]byte)(unsafe.Pointer(&s[0]))[:blen:blen] 32 } 33 34 // Slice returns a byte slice view of a slice. 35 func Slice(s interface{}) []byte { 36 v := reflect.ValueOf(s) 37 first := v.Index(0) 38 sz := int(first.Type().Size()) 39 var res []byte 40 h := (*reflect.SliceHeader)(unsafe.Pointer(&res)) 41 h.Data = first.UnsafeAddr() 42 h.Cap = v.Cap() * sz 43 h.Len = v.Len() * sz 44 return res 45 }