Go语言中如何断言*map[string]interface{}类型包含指定键?
Go中如何断言*map[string]interface{}类型的map包含特定键?
我定义了如下结构体,其中ExternalIds是*map[string]interface{}类型的字段:
type respObj struct { ExternalIds *map[string]interface{} `json:"externalIds,omitempty"` }
获取对象后尝试断言它包含指定键,但代码报错:
myObj := getRespObj() out, _ := json.Marshal(myObj) fmt.Println("Response: ", string(out)) // 输出:{"externalIds":{"payroll":"bigmoney","serial":"GA3MXX4VV7","vin":"1G1YY3388L5112656"}} assert.NotNil(t, myObj.ExternalIds) assert.Contains(t, &myObj.ExternalIds, "payroll") assert.Contains(t, &myObj.ExternalIds, "serial") assert.Contains(t, &myObj.ExternalIds, "vin")
错误信息:
Error: "%!s(**map[string]interface {}=0xc0079bf920)" could not be applied builtin len()
问题原因
你传给assert.Contains的&myObj.ExternalIds是指向map指针的指针(类型为**map[string]interface{}),而assert.Contains需要接收可遍历的集合类型(比如map本身),因此无法对该类型调用len(),导致报错。
解决方案
既然已经用assert.NotNil确保myObj.ExternalIds不为空,直接解引用这个指针,将底层的map对象传给assert.Contains即可:
assert.NotNil(t, myObj.ExternalIds) assert.Contains(t, *myObj.ExternalIds, "payroll") assert.Contains(t, *myObj.ExternalIds, "serial") assert.Contains(t, *myObj.ExternalIds, "vin")
这样就能正常检查map中是否包含指定的键了。
内容的提问来源于stack exchange,提问作者Bill Software Engineer
相关产品推荐
相关产品推荐

