go - 如何正确处理丢失的变量恐慌?
问题描述
我有以下简单的 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)
}
解决方案
正如@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
推荐阅读
- android - 每当进入特定活动屏幕时,应用程序会因 Pending Intent 而崩溃
- java - 无法打开玛丽模拟器
- mysql - mysql slave db错误连接到master
- python - Python/Pandas 通过一个限制获得所有可能的组合
- linux - 在子目录中获取最新的文件(同名)
- c++ - C++ 运算符优先级查询
- inno-setup - 在 Inno Setup 的自定义页面上显示控件背后的背景
- c# - 当我想使用我的搜索功能时,数据未从 UWP 中的 SQL Server 数据库中显示,带有 gridview 和错误
- c++ - reinterpret_cast 错误还是 UB?
- r - 如何在闪亮的两个选项卡上从另一个数据表中过滤一个数据表