背景
在Golang中总是会涉及到类型的转换,尤其是对一些json、rpc协议数据的处理时候,类型转换一旦出错非常容易导致panic,所以在这里mark以下Golang的类型转换
具体类型
yaml的key value转换
// 举个例子,只能转换为map[string]interface{},而不能转换为map[string]string
func GetDCParam() (domain, id, secret, path string) {
data := VehicleActionMap["DATA_CENTER"].(map[string]interface{})
d := data["DOMAIN"].(map[string]interface{})
i := data["CLIENT_ID"].(map[string]interface{})
s := data["CLIENT_SECRET"].(map[string]interface{})
inter := data["INTERFACE"].(map[string]interface{})
domain = d[global.Env].(string)
id = i[global.Env].(string)
secret = s[global.Env].(string)
path = inter["queryVehicleStatusBatch"].(string)
return
}
yaml/json的list
只能先转换为[]interface{},接着遍历,interface{}一个个转换
interface{}不能直接和0值比较
# 正确写法
if ret, ok := res["ret"]; ok {
if ret.(float64) != 0 {
return result, errors.New("unavailable_status: get vehicle status error")
}
}
# 错误写法
if ret, ok := res["ret"]; ok {
if ret != 0 {
return result, errors.New("unavailable_status: get vehicle status error")
}
}
json/opa中的数值在golang里对应类型
- json中不论是整型还是浮点数,在golang对应的都是float64
- opa rego返回的数值则对应json.Number
获取当前变量的方法
import "reflect"
t := reflect.TypeOf(v)