gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:40:05 26 4
gpt4 key购买 nike

我是 Go 语言的新手。

我正在使用 Go、Gorilla 工具包和 Mustache 模板引擎制作一个小型网络应用程序。

到目前为止一切正常。

我使用 hoisie/mustache 和 gorilla/sessions,但我很难将变量从一个传递到另一个。我有一个 map[string]interface{} 传递给模板引擎。当用户登录时,我想获取用户的 session 数据并将其与我的 map[string]interface{} 合并,以便数据可用于呈现。

问题是 gorilla/sessions 返回一个 map[interface{}]interface{} 因此无法完成合并(以我在这门语言中的技能)。

我考虑过在 interface{} 变量中提取字符串(反射?)。我还考虑过让我的 session 数据成为 map[interface{}]interface{} 就像 gorilla/sessions 提供的那样。但我是 Go 的新手,我不知道这是否可以被视为最佳实践。作为一名 Java 专家,我喜欢使用 Object 类型的变量。

我想知道您认为解决这个问题的最佳方法。

提前致谢。

最佳答案

您需要执行类型断言:特别是 this section of 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{} 的快捷方式。

关于go - 如何从 Go 中的 interface{} 变量中提取字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21448037/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com