当我使用文件指针f *os.File
时,我得到一张空地图
func decode(f *os.File, b map[string]interface{}) error {
err := gob.NewDecoder(f).Decode(&b)
fmt.Printf("%+v\n", b)
return err
}
func encode(f *os.File, b map[string]interface{}) error {
bb := map[string]interface{}{
"X": 1,
"Greeting": "hello",
}
err := gob.NewEncoder(f).Encode(bb)
f.Sync()
//fmt.Println(buf.Bytes())
return err
}
打印map[]
如果我用全局缓冲区指针buf *bytes.Buffer
替换它,它可以工作
func decode(f *os.File, b map[string]interface{}) error {
err := gob.NewDecoder(buf).Decode(&b)
fmt.Printf("%+v\n", b)
return err
}
func encode(f *os.File, b map[string]interface{}) error {
bb := map[string]interface{}{
"X": 1,
"Greeting": "hello",
}
err := gob.NewEncoder(buf).Encode(bb)
return err
}
打印map[Greeting:hello X:1]
f像这样在主要打开
var (
buf *bytes.Buffer
f *os.File
memcache map[string]interface{}
)
func main() {
var err error
f, err = os.Create("_memcache.txt")
if err != nil {
log.Print(err.Error())
}
defer f.Close()
memcache = make(map[string]interface{})
buf = new(bytes.Buffer)
gob.Register(map[string]interface{}{})
err = write()
if err != nil {
log.Print(err.Error())
}
err = read()
if err != nil {
log.Print(err.Error())
}
}
func read() (err error) {
err = decode(f, memcache)
if err != nil && err != io.EOF {
return err
}
}
func write() (err error) {
err = encode(f, memcache)
if err != nil {
return err
}
}
答案 0 :(得分:1)
解决方案已在评论中提及,因此更新方法main()
如下:
func main() {
var err error
f, err = os.Create("_memcache.txt")
if err != nil {
log.Print(err.Error())
}
defer f.Close()
memcache = make(map[string]interface{})
buf = new(bytes.Buffer)
gob.Register(map[string]interface{}{})
err = write()
if err != nil {
log.Print(err.Error())
}
// after write the file pointer is at the end of the file,
// so it should be moved:
f.Seek(0, 0)
// alternatively, open the file in read()
err = read()
if err != nil {
log.Print(err.Error())
}
}