1.问题背景:
在首次做Go的相关项目的时候,遇到了将get请求得到的Json字符串进行反序列化(json.Unmarshal([]byte(data), &m))
,转换成var m map[string]interface{}
此种类型,因此m[“access_token”]
就成了interface{}的数据类型,我们需要将此值赋值给一个string类型的变量,但此时我直接使用string()方法则报错。
这里的type assertion其实就给出了解决方案,即类型断言
2.解决方法:
通过查阅相关资料发现的解决方案是,通过value.(type)
-----这里就是类型断言的方式,来将interface{}确定其对应的数据类型,从而能够进行相同数据类型的赋值,例如以下可以:
var data interface{}
data = "hahhhh"
var data1 string
data1 = data.(string)
fmt.Println(data1)//输出hahhhh
//但如果是data的类型不为string时,将会报错,如下。
data2 := data.(int) //会产生错误,错误原因如下
3.总结:
情形一:
从上述的解释来看,好像我项目里直接写.(string)好像也不是很严谨,应该进行类型的判断,然后在进行赋值操作,只不是我那里的m[“access_token”]必定是string类型,所以不会出现错误。
推荐以下方法,先进行类型断言:
if value, ok := m["access_token"].(string); ok {
fmt.Println("类型判断成功", value) //输出--->类型判断成功 hahhhh
}
情形二:
或者存在未知数据类型的情况时,我们可以用type-switch方法(参考Go语言中文网),如下所示:
func MyPrintf(args ...interface{}) {
for _, arg := range args {
switch arg.(type) {
case int:
fmt.Println(arg, "is an int value.")
case string:
fmt.Println(arg, "is a string value.")
case int64:
fmt.Println(arg, "is an int64 value.")
default:
fmt.Println(arg, "is an unknown type.")
}
}
}