Golang 結構體和[]byte相互轉換


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM