在Go語言中,有兩種常見的序列化方式:gob和json。
gob是Go語言自帶的二進制序列化方式,可以高效地處理Go語言中的各種數據類型,并支持自定義類型的序列化和反序列化。與JSON相比,gob的優點在于處理的速度更快,序列化后的數據更小,但其缺點在于無法跨平臺使用,即gob序列化的數據只能在使用相同版本的Go語言編寫的程序間傳遞。
package main import ( "bytes" "encoding/gob" "fmt" ) type Person struct { Name string Age int Email string } func main() { p := Person{"Alice", 30, "alice@example.com"} buf := new(bytes.Buffer) enc := gob.NewEncoder(buf) err := enc.Encode(p) if err != nil { panic(err) } fmt.Println(buf.Bytes()) }
json是一種基于文本的序列化方式,可以跨平臺使用,支持多種編程語言,并且易于閱讀和理解。雖然相比于gob序列化后的數據大,但是在網絡傳輸中,由于大多數應用程序都使用了文本協議,因此JSON成為了一種常見的數據交換格式。
package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"-"` } func main() { p := Person{"Alice", 30, "alice@example.com"} b, err := json.Marshal(p) if err != nil { panic(err) } fmt.Println(string(b)) }
上面這個簡單的例子中,我們定義了一個Person結構體,并且在JSON編碼時使用了標簽來指定對應JSON對象的鍵名和是否序列化。同時,我們還可以將JSON反序列化為Go語言中的結構體:
package main import ( "encoding/json" "fmt" ) type Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"-"` } func main() { b := []byte(`{"name":"Alice","age":30,"email":"alice@example.com"}`) var p Person err := json.Unmarshal(b, &p) if err != nil { panic(err) } fmt.Printf("%+v\n", p) }