go - gob encoding to/decoding from *os.File not working -


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