如何正确处理丢失的变量恐慌?

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

    }


慕后森
浏览 102回答 2
2回答

手掌心

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

您的if陈述形式是有效的,可以在这里使用,但found价值不是您所期望的。它是类型断言的结果,而不是映射索引。_, found := claims["audx"].(string)可以分解为v := claims["audx"] _, ok := v.(string)由于类型断言的零值对您的目的有效,并且您不对索引或断言条件的结果采取任何行动,您可以将表达式简化为:audx, _ := claims["audx"].(string)这是有效的,因为如果映射返回nil,类型断言就会失败,但会给你该类型的零值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go