To serialise the keys and values of a map and code would have to iterate over it
for k,v := range m { // serialise k and v } But map iteration does not have a guaranteed ordering. This is why the result is not stable. On Tuesday, 21 June 2016 15:44:05 UTC+10, Harry wrote: > > Hello guys, > > I'm trying to use encoding/gob package to know how it works. > And I wrote below codes. > > > > import "encoding/gob" > > > func ToGOB64(data interface{}) (string, error) { > b := bytes.Buffer{} > > e := gob.NewEncoder(&b) > err := e.Encode(data) > if err != nil { > fmt.Println(`failed gob Encode`, err) > return "", err > } > return base64.StdEncoding.EncodeToString(b.Bytes()), nil > > } > > > > func FromGOB64(str string, tData interface{}) error { > > by, err := base64.StdEncoding.DecodeString(str) > > if err != nil { > return err > > } > b := bytes.Buffer{} > b.Write(by) > d := gob.NewDecoder(&b) > err = d.Decode(tData) > if err != nil { > return err > > } > return nil > } > > > And then, I prepared for test targeted type are struct, map, interface{}. > > func TestSerializeStruct(t *testing.T) { > u := User{Id: 10, Name: "harry dayo"} > > result, err := ToGOB64(u) > if err != nil { > t.Errorf("TestSerializeStruct error: %s", err) > } > if result != > "Iv+BAwEBBFVzZXIB/4IAAQIBAklkAQQAAQROYW1lAQwAAAAR/4IBFAEKaGFycnkgZGF5bwA=" > { > t.Errorf("TestSerializeStruct result: %+v", result) > } > } > > > > func TestDeSerializeStruct(t *testing.T) { > > > u := User{} > err := FromGOB64( > "Iv+BAwEBBFVzZXIB/4IAAQIBAklkAQQAAQROYW1lAQwAAAAR/4IBFAEKaGFycnkgZGF5bwA=" > , &u) > if err != nil { > t.Errorf("TestDeSerializeStruct error: %s", err) > } > if u.Id != 10 { > t.Errorf("TestDeSerializeStruct result: %+v", u) > } > } > > > //2.map (map is not stable.) > func TestSerializeMap(t *testing.T) { > > > m := map[string]int{"apple": 150, "banana": 300, "lemon": 300} > //when using map, result is not stable. > result, err := ToGOB64(m) > if err != nil { > t.Errorf("TestSerializeMap error: %s", err) > } > if result != > "Dv+DBAEC/4QAAQwBBAAAIP+EAAMFYXBwbGX+ASwGYmFuYW5h/gJYBWxlbW9u/gJY" { > //if result != > "Dv+DBAEC/4QAAQwBBAAAIP+EAAMGYmFuYW5h/gJYBWxlbW9u/gJYBWFwcGxl/gEs" { > t.Errorf("TestSerializeMap result: %#v", result) > } > } > > > // > func TestDeSerializeMap(t *testing.T) { > > > u := map[string]int{} > > //FromGOB64("Dv+DBAEC/4QAAQwBBAAAIP+EAAMFYXBwbGX+ASwGYmFuYW5h/gJYBWxlbW9u/gJY", > > &u) > err := FromGOB64( > "Dv+DBAEC/4QAAQwBBAAAIP+EAAMGYmFuYW5h/gJYBWxlbW9u/gJYBWFwcGxl/gEs", &u) > if err != nil { > t.Errorf("TestDeSerializeMap error: %s", err) > } > if u["apple"] != 150 { > t.Errorf("TestDeSerializeMap result: %#v", u) > } > } > > > > //interface x slice > func TestSerializeInterfaces(t *testing.T) { > > > args := []interface{}{1, "abcde", true} > result, err := ToGOB64(args) > if err != nil { > t.Errorf("TestSerializeInterfaces error: %s", err) > } > if result != > "DP+BAgEC/4IAARAAACX/ggADA2ludAQCAAIGc3RyaW5nDAcABWFiY2RlBGJvb2wCAgAB" { > t.Errorf("TestSerializeInterfaces result: %+v", result) > } > } > > > > func TestDeSerializeInterfaces(t *testing.T) { > > > args := []interface{}{} > err := FromGOB64( > "DP+BAgEC/4IAARAAACX/ggADA2ludAQCAAIGc3RyaW5nDAcABWFiY2RlBGJvb2wCAgAB", & > args) > if err != nil { > t.Errorf("TestDeSerializeInterfaces error: %s", err) > } > if args[0] != 1 || args[1] != "abcde" || args[2] != true { > t.Errorf("TestDeSerializeInterfaces result: %+v", args) > } > } > > > > As a result, serialized map value often change though deserialized map is > no problem. > Why serialized value is not invaliable when using map value. > > I'd like to know that reason sincerely. > > Thanks in advance. > > > > > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.