json 获取错误接口转换:接口{}是Map[字符串]接口{},而不是Map[字符串]字符串-为什么失败

5cg8jx4n  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(215)

为什么下面的语句会失败:

// 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也是字符串吗?
x4shl7ld

x4shl7ld1#

接口值有两个方面:一个数据类型,以及该类型的数据值。类型Assert如dep.(X)返回存储在接口dep中的值,如果该值是X类型。
因此,根据这个错误,您可以看到dep中存储的值是map[string]interface{},而不是map[string]string,这就是类型Assert失败的原因。
根据代码,我相信有一个默认的期望,你想从Map中得到一个字符串值,正如我之前所说的,一个接口包含一个值,所以一旦你恢复了包含在dep中的值,那么你就可以访问一个键的值,也就是一个interface{},然后访问其中的值,所以:

k,ok:=dep.(map[string]interface{})[packageName]
if ok {
   str, ok:=k.(string)
   if ok {
      // k is a string, and str is the string contained in `packageName` key in the map
   } else {
      // k is not a string
   }
}

相关问题