色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

gob json protobuf

老白2年前9瀏覽0評(píng)論

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)
}