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

如何从 Go 中的 interface{} 变量中提取字符串?

如何从 Go 中的 interface{} 变量中提取字符串?

Go
慕田峪9158850 2021-07-07 17:09:25
我是 Go 语言的新手。我正在使用 Go、Gorilla 工具包和 Mustache 模板引擎制作一个小型 Web 应用程序。到目前为止一切都很好。我使用 hoisie/mustache 和 gorilla/sessions,但我正在努力将变量从一个传递到另一个。我有一个传递给模板引擎的 map[string]interface{}。当用户登录时,我想获取用户的会话数据并将其与我的 map[string]interface{} 合并,以便数据可用于渲染。问题是 gorilla/sessions 返回一个 map[interface{}]interface{} 因此无法完成合并(以我在这种语言方面的技能)。我想过提取 interface{} 变量中的字符串(反射?)。我还考虑过让我的会话数据成为地图[接口{}]接口{},就像 gorilla/sessions 提供的那样。但我是 Go 的新手,我不知道这是否可以被视为最佳实践。作为一个 Java 人,我喜欢使用 Object 类型的变量。我想知道您认为解决此问题的最佳方法。提前致谢。
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

您需要执行类型断言:特别是 Effective Go 的这一部分。


str, ok := value.(string)

if ok {

    fmt.Printf("string value is: %q\n", str)

} else {

    fmt.Printf("value is not a string\n")

}

给出您要执行的操作的更精确示例:


if userID, ok := session.Values["userID"].(string); ok {

     // User ID is set

} else {

     // User ID is not set/wrong type; raise an error/HTTP 500/re-direct

}


type M map[string]interface{}


err := t.ExecuteTemplate(w, "user_form.tmpl", M{"current_user": userID})

if err != nil {

    // handle it

}

您所做的是确保您从 interface{} 容器中提取的用户 ID 实际上是一个字符串。{} 如果不是,你处理它(如果你不这样做,你会按照文档编写程序恐慌)。


如果是,您可以将其传递给您的模板,您可以在该模板中将其作为{{ .current_user }}. M是我用来避免每次调用模板渲染函数时都必须输入 map[string]interface{} 的快捷方式。


查看完整回答
反对 回复 2021-07-19
  • 1 回答
  • 0 关注
  • 434 浏览
慕课专栏
更多

添加回答

举报

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