funcmain() { pa := &Address{"private", "Aartselaar","Belgium"} wa := &Address{"work", "Boom", "Belgium"} vc := VCard{"Jan", "Kersschot", []*Address{pa,wa}, "none"} fmt.Printf("%v: \n", vc) // {Jan Kersschot [0x126d2b80 0x126d2be0] none}: // using an encoder: file, _ := os.OpenFile("vcard.gob", os.O_CREATE|os.O_WRONLY, 0666) defer file.Close() enc := gob.NewEncoder(file) err := enc.Encode(vc) if err != nil { log.Println("Error in encoding gob") } }
说明
Gob 并不是一种不同于 Go 的语言,而是在编码和解码过程中用到了 Go 的反射。
Gob 文件或流是完全自描述的:里面包含的所有类型都有一个对应的描述,并且总是可以用 Go 解码,而不需要了解文件的内容。
只有可导出的字段会被编码,零值会被忽略。在解码结构体的时候,只有同时匹配名称和可兼容类型的字段才会被解码。当源数据类型增加新字段后,Gob 解码客户端仍然可以以这种方式正常工作:解码客户端会继续识别以前存在的字段。并且还提供了很大的灵活性,比如在发送者看来,整数被编码成没有固定长度的可变长度,而忽略具体的 Go 类型。
假如在发送者这边有一个有结构 T:
1 2
type T struct { X, Y, Z int } var t = T{X: 7, Y: 0, Z: 8}