when use file pointer f *os.file empty map back
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 } prints map[]
if replace global buffer pointer buf *bytes.buffer works
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 } prints map[greeting:hello x:1]
f opened in main
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 } }
the solution mentioned in comments, update method main() following:
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 file pointer @ end of file, // should moved: f.seek(0, 0) // alternatively, open file in read() err = read() if err != nil { log.print(err.error()) } }
Comments
Post a Comment