我是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类型的变量。
我想知道您认为这个问题的最佳方法。
提前致谢。
答案 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 {}。