程序目标:

将结构体以二进制方式写入文件。然后从文件读出来,再还原成结构体。

问题:

如果仅仅在内存中操作(代码里获得结构体的二进制后,直接再转成结构体),是可以正常实现的。
但如果将二进制写入文件,再从文件读出来进行还原,就不行了。不知是哪里出了问题。

代码:

1、结构体和二进制进行转换的方法

type MockSlice struct {
    Data uintptr
    Len uint64
    Cap uint64
}

/**
    结构体转二进制
 */

func Struct2bin(dataPtr unsafe.Pointer, size uint64) []byte {
    ms := &MockSlice{
        Data: uintptr(dataPtr),
        Len:  size,
        Cap:  size,
    }

    byteVal := *(*[]byte)(unsafe.Pointer(ms))
    return byteVal
}


//二进制转结构体

func Bin2struct( binData []byte) MockSlice {
    ms := *(*MockSlice)(unsafe.Pointer(&binData))
    return ms
}

2、具体用例代码

//将结构体写入文件
func TestStruct2bin(t *testing.T) {

    //构建结构体
    w := Width{wid:"宽"}

    p := &People{
        age:  222,
        name: "LY",
    }

    f := Figure{height:1000,width:[]Width{w}}
    p.fig = f
    p.age = 1000
    p.name = "PPp"

    //将结构体转成二进制
    rs := Struct2bin(unsafe.Pointer(p),uint64(unsafe.Sizeof(*p)))

    //打开文件
    file,err := os.OpenFile("D:/minidb/minidb.dict", os.O_RDWR, 0644)
    if err != nil {
        fmt.Println(err)
    }


    //将二进制写入文件
    binary.Write(file, binary.LittleEndian, rs)
    file.Close()
}
//从文件读出二进制,转成结构体
func TestStruct2bin(t *testing.T) {
    //打开文件
    file,err := os.OpenFile("D:/minidb/minidb.dict", os.O_RDWR, 0644)
    if err != nil {
        fmt.Println(err)
    }

    buff := new(bytes.Buffer)
    buff.ReadFrom(file)
    fmt.Println(buff.Bytes())

    //将二进制转成结构体
    ms := Bin2struct(buff.Bytes())
    fmt.Println(*(*People)(unsafe.Pointer(ms.Data)))

}