Golang类型转换的一些总结

208 阅读1分钟

背景

在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里对应类型

  1. json中不论是整型还是浮点数,在golang对应的都是float64
  2. opa rego返回的数值则对应json.Number

获取当前变量的方法

import "reflect"

t := reflect.TypeOf(v)