猿问

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

我是 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 类型的变量。

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

提前致谢。


慕田峪9158850
浏览 435回答 1
1回答

动漫人物

您需要执行类型断言:特别是 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{} 的快捷方式。
随时随地看视频慕课网APP

相关分类

Go
我要回答