程序目标:
将结构体以二进制方式写入文件。然后从文件读出来,再还原成结构体。
问题:
如果仅仅在内存中操作(代码里获得结构体的二进制后,直接再转成结构体),是可以正常实现的。
但如果将二进制写入文件,再从文件读出来进行还原,就不行了。不知是哪里出了问题。
代码:
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)))
}