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

时间:2014-01-30 04:49:09

标签: go

我是Go语言的新手。

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

到目前为止,一切都很顺利。

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

问题是gorilla / sessions返回了一个map [interface {}] interface {},因此无法完成合并(使用这种语言的技能)。

我考虑过在接口{}变量中提取字符串(反射?)。 我还考虑过将会话数据设置为map [interface {}] interface {},就像gorilla / sessions提供的那样。但我是Go的新手,我不知道这是否可以被视为最佳实践。作为一个Java人,我想使用Object类型的变量。

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

提前致谢。

1 个答案:

答案 0 :(得分:3)

您需要执行类型断言:具体为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
}

您正在做的是确保从接口{}容器中取出的用户ID实际上是一个字符串。如果不是,你会处理它(如果你不这样做,你的程序将根据文档发生恐慌)。

如果是,请将其传递到您可以{{ .current_user }}访问的模板。 M是一个快捷方式,我每次调用模板渲染函数时都会使用它来避免输入map [string] interface {}。