Golang - 避坑

# interface{} nil 判断

interface{} 类型的变量 包含了2个指针, 一个指针指向值类型, 一个指向实际的值 对于 interface{} 类型的 nil 变量来说, 他的两个指针都是 0, 当我们将一个具体类型的值赋值给一个 interface{} 类型的变量的时候, 就同时把类型和值都赋值给了 interface{} 里的两个指针. 如果类型的值是 nil 的话, interface{} 变量依然会存储对应的类型指针和值指针. 此时值指针指向 nil 变量, 类型指针指向的是非 nil 变量, 此时 a == nil 返回 false.

解决: 避免将一个有可能 nil 的变量赋值给 interface{} 变量.

# json 解析

json unmarshal 解析数字默认使用 float64 类型, 然后float64数值在marshal时, 有一定概率(如果个位为0)会变为科学计数法形式….. 解决方案是使用 Decoder.UseNumber()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
func xxxx() {
    // ......
    v := make(map[string]interface{})

    // resp_body是后端的http返回结果
    d := json.NewDecoder(bytes.NewReader(resp_body))
    d.UseNumber()
    err = d.Decode(&v)
    if err != nil {
        // 错误处理
    }

    // 修饰返回值再做Marshal
}
Licensed under CC BY-NC-SA 4.0