gob、json、protobuf 是三種常用的數據編解碼方式,它們分別具有不同的優缺點和適用場景。
gob 是 Go 自帶的二進制編碼方式,它具有高效、緊湊的優勢,但只適用于 Go 語言內部的數據傳輸和存儲。
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 是一種輕量級的數據交換格式,具有很好的可讀性和跨語言支持,但編解碼效率不如二進制方式。
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 開發的一種二進制數據交換格式,與 json 相比能更好地壓縮數據、節省網絡帶寬和存儲空間,但需要通過定義 proto 文件來生成 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) }
上一篇mysql加密算法
下一篇html左邊距怎么設置