## 对Go数据编码和解码 除了JSON,TOML和YAML之外,Go还具有许多其他编码类型。这些类型主要用于在Go进程之间传输数据,例如协议和RPC,或者在某些字符格式受限制的情况下。 本节将探讨编码和解码gob格式和base64。后续章节将探讨GRPC等协议。 ### 实践 1. 创建gob.go: ``` package encoding import ( "bytes" "encoding/gob" "fmt" ) type pos struct { X int Y int Object string } // GobExample展示了如何使用gob包 func GobExample() error { buffer := bytes.Buffer{} p := pos{ X: 10, Y: 15, Object: "wrench", } // 注意如果p是个接口我们需要先调用gob.Register e := gob.NewEncoder(&buffer) if err := e.Encode(&p); err != nil { return err } // 这里是二进制的 所以打印出来的长度可能并不准确 fmt.Println("Gob Encoded valued length: ", len(buffer.Bytes())) p2 := pos{} d := gob.NewDecoder(&buffer) if err := d.Decode(&p2); err != nil { return err } fmt.Println("Gob Decode value: ", p2) return nil } ``` 2. 创建base64.go: ``` package encoding import ( "bytes" "encoding/base64" "fmt" "io/ioutil" ) // Base64Example 演示了如何使用 base64 包 func Base64Example() error { // base64对于不支持以字节/字符串操作的二进制格式的情况很有用 // 使用辅助函数和URL编码 value := base64.URLEncoding.EncodeToString([]byte("encoding some data!")) fmt.Println("With EncodeToString and URLEncoding: ", value) // 解码 decoded, err := base64.URLEncoding.DecodeString(value) if err != nil { return err } fmt.Println("With DecodeToString and URLEncoding: ", string(decoded)) return nil } // Base64ExampleEncoder 与上面的函数类似 但并没有使用URL编码 func Base64ExampleEncoder() error { buffer := bytes.Buffer{} // 建立编码器 encoder := base64.NewEncoder(base64.StdEncoding, &buffer) // 确认关闭 if err := encoder.Close(); err != nil { return err } if _, err := encoder.Write([]byte("encoding some other data")); err != nil { return err } fmt.Println("Using encoder and StdEncoding: ", buffer.String()) decoder := base64.NewDecoder(base64.StdEncoding, &buffer) results, err := ioutil.ReadAll(decoder) if err != nil { return err } fmt.Println("Using decoder and StdEncoding: ", string(results)) return nil } ``` 3. 建立main.go: ``` package main import ( "github.com/agtorre/go-cookbook/chapter3/encoding" ) func main() { if err := encoding.Base64Example(); err != nil { panic(err) } if err := encoding.Base64ExampleEncoder(); err != nil { panic(err) } if err := encoding.GobExample(); err != nil { panic(err) } } ``` 4. 这会输出: ``` With EncodeToString and URLEncoding: ZW5jb2Rpbmcgc29tZSBkYXRhIQ== With DecodeToString and URLEncoding: encoding some data! Using encoder and StdEncoding: ZW5jb2Rpbmcgc29tZSBvdGhlciBkYXRh Using decoder and StdEncoding: encoding some other data Gob Encoded valued length: 57 Gob Decode value: {10 15 wrench} ``` ### 说明 Gob编码是一种使用Go数据类型构建的流格式。在连续发送和编码时效率最高。对于单个项目,其他编码格式(如JSON)可能更高效且易于移植。使用gob编码使得编组大型复杂结构并在单独的过程中重建它们变得简单。虽然这里没有显示,但gob也可以使用自定义MarshalBinary和UnmarshalBinary方法对自定义类型或未导出类型进行操作。 Base64编码对于通过GET请求中的URL进行通信或生成二进制数据的字符串表示编码非常有用。大多数语言都支持这种格式,并在另一端解码数据。因此,在不支持JSON格式的情况下,对JSON等内容进行Base64编码是很常见的。 * * * * 学识浅薄,错误在所难免。欢迎在群中就本书提出修改意见,以飨后来者,长风拜谢。 Golang中国(211938256) beego实战(258969317) Go实践(386056972)