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  //}