为什么下面的语句会失败:
// type of fileData --> type PackageJson map[string]interface{}
dep, fDep := fileData["dependencies"]
if fDep {
// Following Line Fails
version, fVer := dep.(map[string]string)[packageName]
}
上面的语句抛出一个错误:
interface conversion: interface {} is map[string]interface {}, not map[string]string [recovered]
此处:
dep
的类型为interface{}
- 对于语句
dep.(map[string]string)[packageName]
,我不是在说dep
是一个Map,key是字符串,value也是字符串吗?
1条答案
按热度按时间x4shl7ld1#
接口值有两个方面:一个数据类型,以及该类型的数据值。类型Assert如
dep.(X)
返回存储在接口dep
中的值,如果该值是X
类型。因此,根据这个错误,您可以看到dep中存储的值是
map[string]interface{}
,而不是map[string]string
,这就是类型Assert失败的原因。根据代码,我相信有一个默认的期望,你想从Map中得到一个字符串值,正如我之前所说的,一个接口包含一个值,所以一旦你恢复了包含在
dep
中的值,那么你就可以访问一个键的值,也就是一个interface{}
,然后访问其中的值,所以: