除了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编码是很常见的。
最后编辑: kuteng 文档更新时间: 2021-01-03 15:03 作者:kuteng