You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:25:27