首页 > 解决方案 > 如何正确处理丢失的变量恐慌?

问题描述

我有以下简单的 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)
    }

标签: go

解决方案


正如@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


推荐阅读