package scripts_stroage import ( "encoding/json" "fmt" "testing" ) // 反序列化時,如果不傳對應 json里面的字段,就會解析為 對應數據類型的 "零值" type TestStruct1 struct { Name string `json:"name"` Age int `json:"age"` IsBoy bool `json:"is_boy"` } // 類型是指針類型 // 序列化時,如果不指定value,就會被解析成 null(json的空值) //反序列化時,如果不傳對應 json里面的字段,就會解析為 nil type TestStruct2 struct { Name *string `json:"name"` Age *int `json:"age"` IsBoy *bool `json:"is_boy"` } func TestST1(t *testing.T) { // -------------- 序列化測試 ---------------- // 1、序列化成一個字符串,有默認值 t1 := TestStruct1{} data1, _ := json.Marshal(t1) fmt.Printf("data1: %s \n", data1) // {"name":"","age":0,"is_boy":false} // 2、序列化成一個字符串,默認都序列化成了 null !!! t2 := TestStruct2{} data2, _ := json.Marshal(t2) fmt.Printf("data2: %s \n", data2) // data2: {"name":null,"age":null,"is_boy":null} // -------------- 反序列化測試 ---------------- fmt.Println("===================================================") s := `{"gender":"male"}` // 沒有json指定的字段~ // 用第一個反序列化 返回:字符串、數字、bool值 的默認值 var sObj1 TestStruct1 _ = json.Unmarshal([]byte(s), &sObj1) fmt.Println("sRet1: ", sObj1.Name, sObj1.Age, sObj1.IsBoy) // sRet1: 0 false // TODO 用第二個反序列化 返回:三個nil!!!因為我們是用指針去反序列化的,指針的默認值就是nil var sObj2 TestStruct2 _ = json.Unmarshal([]byte(s), &sObj2) fmt.Println("sRet2: ", sObj2.Name, sObj2.Age, sObj2.IsBoy) // sRet2: <nil> <nil> <nil> // TODO 第二種方法反序列化出來以后,再次賦值,注意只能用變量去設置,因為我們可以取到變量的地址,但是不能獲取常量的地址 defaultName := "whw" defaultAge := 22 defaultBoy := true if sObj2.Name == nil { sObj2.Name = &defaultName } if sObj2.Age == nil { sObj2.Age = &defaultAge } if sObj2.IsBoy == nil { sObj2.IsBoy = &defaultBoy } // TODO 因為是指針,所以用 * 去取value fmt.Println("sRet2再次初始化: ", *sObj2.Name, *sObj2.Age, *sObj2.IsBoy) // sRet2再次初始化: whw 22 true }



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
序列化結果不想帶一些屬性的零值—>加omitempty標簽

寫一個方法去返回 *bool 解析后的值並根據業務需求設置默認值


~~~~~~~~~~~~~~~~~~
