github.com/JohanShen/go-utils@v1.1.4-0.20201117124024-901319a2b2a0/utils/converter.go (about) 1 package utils 2 3 import "github.com/vmihailenco/msgpack/v5" 4 import "unsafe" 5 6 // 字符串转字节组 7 func StringToBytes(s string) []byte { 8 x := (*[2]uintptr)(unsafe.Pointer(&s)) 9 h := [3]uintptr{x[0], x[1], x[1]} 10 return *(*[]byte)(unsafe.Pointer(&h)) 11 } 12 13 // 字节组转字符串 14 func BytesToString(b []byte) string { 15 return *(*string)(unsafe.Pointer(&b)) 16 } 17 18 func StructToBytes(obj interface{}) ([]byte, error) { 19 val, err := msgpack.Marshal(obj) 20 if err != nil { 21 return []byte{}, err 22 } 23 return val, nil 24 } 25 26 func BytesToStruct(bytes []byte, obj interface{}) error { 27 return msgpack.Unmarshal(bytes, &obj) 28 } 29 30 // struct 转 bytes 代码备用研究 31 // 用 unsafe 方法实现 32 //func MyStructToBytes(s interface{}) []byte { 33 // var sizeOfMyStruct = int(unsafe.Sizeof(interface{})) 34 // var x reflect.SliceHeader 35 // x.Len = sizeOfMyStruct 36 // x.Cap = sizeOfMyStruct 37 // x.Data = uintptr(unsafe.Pointer(s)) 38 // return *(*[]byte)(unsafe.Pointer(&x)) 39 //} 40 // 41 //func BytesToMyStruct(b []byte) *MyStruct { 42 // return (*MyStruct)(unsafe.Pointer( 43 // (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data, 44 // )) 45 //}