为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕后森 2022-07-11 15:04:17
我有以下简单的 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


查看完整回答
反对 回复 2022-07-11
?
LEATH

TA贡献1936条经验 获得超6个赞

您的if陈述形式是有效的,可以在这里使用,但found价值不是您所期望的。它是类型断言的结果,而不是映射索引。

_, found := claims["audx"].(string)

可以分解为

v := claims["audx"]
_, ok := v.(string)

由于类型断言的零值对您的目的有效,并且您不对索引或断言条件的结果采取任何行动,您可以将表达式简化为:

audx, _ := claims["audx"].(string)

这是有效的,因为如果映射返回nil,类型断言就会失败,但会给你该类型的零值。


查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信