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