我有以下简单的 go-lang 代码。aud := claims["aud"].(string)这是一个 jwt 声明,因此它始终存在。然后我试图尝试将变量从 aud 更改为missing-aud。当我改变它,然后测试。我注意到了严重的恐慌。[PANIC RECOVER] 接口转换:接口 {} 为 nil,不是字符串 goroutine 7处理缺失变量而不是恐慌的最简单方法是什么?我试过了,但似乎不是这样。var aud string if claims["audx"].(string) != "" { aud = claims["audx"].(string) }感谢任何可以提供帮助的人修改了答案,但正在寻找是否可以简化? var aud string if _, found := claims["audx"].(string); found { aud = claims["audx"].(string) }
2 回答
手掌心
TA贡献1942条经验 获得超3个赞
正如@JimB 指出的那样-您将类型断言(claims["audx"].(string))与映射键存在检查(v, ok := claims["audx"])混淆了:
如果您的地图值是类型interface{}- 那么是的,您需要类型断言。但是您还需要在检查值之前进行密钥检查,例如
if v, ok := claims["audx"]; ok {
log.Printf("audx key exists")
if vs, ok := v.(string); ok {
// "audx" value is a string
aud = vs
log.Printf("audx value is a string: %q", aud)
}
}
这个游乐场示例应该更清楚: https: //play.golang.org/p/pTOR39wDCx5
LEATH
TA贡献1936条经验 获得超6个赞
您的if
陈述形式是有效的,可以在这里使用,但found
价值不是您所期望的。它是类型断言的结果,而不是映射索引。
_, found := claims["audx"].(string)
可以分解为
v := claims["audx"] _, ok := v.(string)
由于类型断言的零值对您的目的有效,并且您不对索引或断言条件的结果采取任何行动,您可以将表达式简化为:
audx, _ := claims["audx"].(string)
这是有效的,因为如果映射返回nil
,类型断言就会失败,但会给你该类型的零值。
- 2 回答
- 0 关注
- 101 浏览
添加回答
举报
0/150
提交
取消