Go Pitfalls and Patterns
1. 如何获取interface的reflect.Type
type Duck interface {
Quack()
}
var reflectTypeOfDuck = reflect.TypeOf(struct { Duck }).Field(0).Type()
func IsDuck(val reflect.Value) bool {
return val.Type().Implements(reflectTypeOfDuck)
}
2. 不要用map[string]interface{}来Unmarshal
避免下面的用法
m := map[string]interface{}{}
json.Unmarshal(data, &m)
println(m["message"].(string)) // 这里转换失败会panic, 除非 message, ok := m["message"].(string)
尝试使用下面的用法
m := struct{
Message string `json:"message"`
}{}
json.Unmarshal(data, &m)
println(m.Message)
3. defer时机
func f() {
defer println("a")
{
defer println("b")
}
if true {
defer println("c")
}
for i := 0; i < 3; i++ {
defer println(i)
}
defer println("end")
}
/*
end
2
1
0
c
b
a
*/
注意 {}
中的defer
(包括 if
, for
中) 均会在函数返回时执行, 而不是出当前作用域