gob、json、protobuf 是三種常用的數(shù)據(jù)編解碼方式,它們分別具有不同的優(yōu)缺點(diǎn)和適用場(chǎng)景。
gob 是 Go 自帶的二進(jìn)制編碼方式,它具有高效、緊湊的優(yōu)勢(shì),但只適用于 Go 語(yǔ)言內(nèi)部的數(shù)據(jù)傳輸和存儲(chǔ)。
func main() { // 編碼 var buf bytes.Buffer enc := gob.NewEncoder(&buf) data := map[string]string{"name": "Tom", "gender": "Male"} if err := enc.Encode(data); err != nil { log.Fatal("encode error:", err) } fmt.Println(buf.Bytes()) // 解碼 dec := gob.NewDecoder(&buf) var result map[string]string if err := dec.Decode(&result); err != nil { log.Fatal("decode error:", err) } fmt.Println(result) }
json 是一種輕量級(jí)的數(shù)據(jù)交換格式,具有很好的可讀性和跨語(yǔ)言支持,但編解碼效率不如二進(jìn)制方式。
type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { // 編碼 person := Person{Name: "Tom", Age: 18} data, err := json.Marshal(person) if err != nil { log.Fatal("marshal error:", err) } fmt.Println(string(data)) // 解碼 var result Person if err := json.Unmarshal(data, &result); err != nil { log.Fatal("unmarshal error:", err) } fmt.Println(result) }
protobuf 是 Google 開(kāi)發(fā)的一種二進(jìn)制數(shù)據(jù)交換格式,與 json 相比能更好地壓縮數(shù)據(jù)、節(jié)省網(wǎng)絡(luò)帶寬和存儲(chǔ)空間,但需要通過(guò)定義 proto 文件來(lái)生成 Go 代碼。
syntax = "proto3"; package person; message Person { string name = 1; int32 age = 2; } func main() { // 編碼 person := &Person{Name: "Tom", Age: 18} data, err := proto.Marshal(person) if err != nil { log.Fatal("marshal error:", err) } fmt.Println(string(data)) // 解碼 var result Person if err := proto.Unmarshal(data, &result); err != nil { log.Fatal("unmarshal error:", err) } fmt.Println(result) }