除了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