有句话说,没用过 unmarshal 就等於没写过 go
func Unmarshal(data []byte, v interface{}) error
Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v. If v is nil or not a pointer, Unmarshal returns an InvalidUnmarshalError.
简单来说,收到 data ,用 unmarshal 的方式解到 v 所指向的值
data 须为 []byte 型态 ,v 通常会用 &x 这种写法
本身用过的 unmarshal 方式有两种
1.指定 struct 的方式
2.用 map[string]interface{} 的方式
先定义一个天线宝宝 struct
type Teletubbies struct {
Name string
Color string
}
准备一个 要用来解开的string
sliceString := `[{"Name": "Tinky Winky", "Color": "Purple"},{"Name": "Dipsy", "Color": "Green"}]`
注意~~这是一个 slice 而非 json 格式哦
用 struct 的方式解开他
x1 := []Teletubbies{}
err := json.Unmarshal([]byte(sliceString), &x1)
if err != nil {
fmt.Println(err)
return
}
unmarshal 非常容易发生错误,请做好错误处理
也可以用 map[string]interface 的方试是看看
mapInSlice := []map[string]interface{}{}
err = json.Unmarshal([]byte(sliceString), &mapInSlice)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(mapInSlice)
接下来我们就要解看看 json 格式罗
mapString := `{"kk1":{"Name": "Tinky Winky", "Color": "Purple"},"kk2":{"Name": "Dipsy", "Color": "Green"},"kk3":{"Name": "Laa-Laa"}}`
layer1 := make(map[string]interface{})
err = json.Unmarshal([]byte(mapString), &layer1)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(layer1)
fmt.Println(layer1["kk1"])
此时的 layer1["kk1"]仍然是一个 map ,但型态为 interface{}
可以用 assertion 来断言
if _, ok := layer1["kk1"].(map[string]interface{}); ok {
layer2 := layer1["kk1"].(map[string]interface{})
fmt.Println(layer2["Name"])
}
上面说到 unmarshal 很容易坏掉,assertion 也是很容易坏掉的,做好错误处理 or 更多的预防可以减少服务爆炸的风险。
>>: [13th][Day20] docker network
在有必要的时候,我们可能需要使用寄信来通知使用者、寄信给公会小姐、 把AI数据视觉化的资料寄给老板。...
在上一篇我们完成面的旋转,却发现旋转途中若点击放开,面会停留在旋转途中,今天我们就要来解决这个问题。...
-代码仓库:git 顾名思义,整合测试结合了代码单元、模组或子系统并对其进行测试。在托管代码储存库...
前言 本文说明如何进行下单作业。 程序实作 # 设定交易标的 # 以台股上市股票:长荣 contra...
Scope Scope 指得是Coroutines 可以作用的范围。 在Main thread上或I...