Golang數據結構與[]byte的相互轉換,需要了解兩個數據結構具體的底層實現,然后構造相同的數據結構進行轉換即可。
package main import ( "fmt" "unsafe" ) type Data struct { a,b int32 c map[string]interface{} } type SliceMock struct { addr uintptr len int cap int } func main() { d := Data{ a: 1, b: 2, c: map[string]interface{}{ "name": "thomas", "age": 89, }, } /* 因[]byte底層數據結構與slicemock一致,需要構造一個完全一樣 的數據結構進行轉換 */ len := unsafe.Sizeof(d) sliceMockTest := SliceMock{ addr: uintptr(unsafe.Pointer(&d)), len : int(len), cap : int(len), } structToByte := *(*[]byte)(unsafe.Pointer(&sliceMockTest)) fmt.Printf("structToByte: %T, %v\n", structToByte, structToByte) /* []byte轉換成數據結構,只需取出addr地址即可,然后轉換成對應的 數據結構類型即可 */ byteToStruct := *(*Data)(unsafe.Pointer(&structToByte[0])) fmt.Println("byteToStuct: ", byteToStruct) return }
輸出結果如下:
structToByte: []uint8, [1 0 0 0 2 0 0 0 56 174 5 0 192 0 0 0] byteToStruct: {1 2 map[age:89 name:thomas]}