Go语言常用到的几种编解码器

编解码器

base64
gob

json
thrift
msgpack
protobuf

gencode

base64

示例代码如下:

package main

import (
	"encoding/base64"
	"fmt"
)

func main() {
	msg := "Hello, 世界"
	encoded := base64.StdEncoding.EncodeToString([]byte(msg))
	fmt.Println("base64 encode: ", encoded)
	decoded, err := base64.StdEncoding.DecodeString(encoded)
	if err != nil {
		fmt.Println("base64 decode error: ", err)
		return
	}

	fmt.Println("base64 decode: ", string(decoded))
}

输出结果如下:

base64 encode:  SGVsbG8sIOS4lueVjA==
base64 decode:  Hello, 世界

json

示例代码如下:

package main

import (
	"encoding/json"
	"fmt"
)

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

func main() {
	p := Person{
		Name: "xiaoming",
		Age:  16,
	}

	ret, _ := json.Marshal(p)
	fmt.Println(string(ret))

	pp := Person{}
	_ = json.Unmarshal(ret, &pp)
	fmt.Printf("%+v", pp)

}

输出结果如下:

{"name":"xiaoming","age":16}
{Name:xiaoming Age:16}

gob(Go binary)

示例代码如下:

package main

import (
	"bytes"
	"encoding/gob"
	"fmt"
	"log"
)

type P struct {
	X, Y, Z int
	Name    string
}

type Q struct {
	X, Y *int32
	Name string
}

func main() {
	buf := new(bytes.Buffer)
	enc := gob.NewEncoder(buf)
	dec := gob.NewDecoder(buf)
	// Encode (send) the value.
	err := enc.Encode(P{3, 4, 5, "Pythagoras"})
	if err != nil {
		log.Fatal("encode error:", err)
	}
	fmt.Println(buf.Bytes())

	// Decode (receive) the value.
	var q Q
	err = dec.Decode(&q)
	if err != nil {
		log.Fatal("decode error:", err)
	}

	fmt.Printf("%q: {%d,%d}\n", q.Name, *q.X, *q.Y)
}

输出结果如下:

[42 255 129 3 1 1 1 80 1 255 130 0 1 4 1 1 88 1 4 0 1 1 89 1 4 0 1 1 90 1 4 0 1 4 78 97 109 101 1 12 0 0 0 21 255 130 1 6 1 8 1 10 1 10 80 121 116 104 97 103 111 114 97 115 0]
"Pythagoras": {3,4}

msgpack

示例代码如下:

package main

import (
	"fmt"

	"github.com/vmihailenco/msgpack"
)

type Person struct {
	Name   string
	Age    int
	Gender string
}

func main() {
	p1 := Person{
		Name:   "xiaoming",
		Age:    16,
		Gender: "M",
	}

	// marshal
	b, err := msgpack.Marshal(p1)
	if err != nil {
		fmt.Printf("msgpack marshal failed, err:%v", err)
		return
	}

	// unmarshal
	var p2 Person
	err = msgpack.Unmarshal(b, &p2)
	if err != nil {
		fmt.Printf("msgpack unmarshal failed, err:%v", err)
		return
	}
	fmt.Printf("p2:%#v\n", p2)
}

输出结果如下:

p2:main.Person{Name:"xiaoming", Age:16, Gender:"M"}

protobuf

#gencode
andyleap/gencode

字符串格式化常用功能

格式化 功能
%v 按值的本来值输出
%+v 在 %v 基础上,对结构体字段名和值进行展开
%#v 输出 Go 语言语法格式的值
%T 输出 Go 语言语法格式的类型和值
%% 输出 % 本体
%b 整型以二进制方式显示
%o 整型以八进制方式显示
%d 整型以十进制方式显示
%x 整型以十六进制方式显示
%X 整型以十六进制、字母大写方式显示
%U Unicode 字符
%f 浮点数
%p 指针,十六进制方式显示

性能测试结果

由快到慢:gencode、msgpack、protobuf、json、xml