其他包中未定义html/template类型的Golang全局变量
我已经按照这个问题的建议声明了一个全局var 在其他包中未定义html/template类型的Golang全局变量,go,Go,我已经按照这个问题的建议声明了一个全局var 在func main()之前,我在我的主包中声明了全局变量,但它仍然没有在另一个包中声明 package main import{ "html/template" ..... ) var tmpl = template.New("master") func main() { func init() { _, err := tmpl.ParseGlob("templates/*.html") i
func main()
之前,我在我的主包中声明了全局变量,但它仍然没有在另一个包中声明
package main
import{
"html/template"
.....
)
var tmpl = template.New("master")
func main() {
func init() {
_, err := tmpl.ParseGlob("templates/*.html")
if err != nil {
log.Fatalln("Error loading templates:", err)
}
....
}
在另一个包中,我在函数中编写:
tmpl.ExecuteTemplate(w, "venue-index.html", res)
但我犯了个错误
tmpl:未定义
我意识到还有其他类似的问题,但答案并没有解决我的问题。我做错了什么?
tmpl
将无法从另一个包中看到。要从其他包中导入变量,必须使用完全限定的名称引用它们,并使变量以大写字母开头,pack.Tmpl
等
此外,无法将变量从
main
导入到其他包中。这是我用于在助手包中声明模板的解决方案:
package helpers
import (
"html/template"
"log"
)
// Tmpl global template var
var Tmpl = template.New("master")
func init() {
_, err := Tmpl.ParseGlob("templates/*.html")
if err != nil {
log.Fatalln("Error loading templates:", err)
}
}
然后在我的控制器包中:
package controllers
import (
"myapp/helpers"
)
someFunc() {
....
helpers.Tmpl.ExecuteTemplate(w, "header.html", nil)
....
}
@markhorrocks:是的,如果一个助手软件包被多个软件包使用,那么它是有意义的。这并不是非常罕见,这是不可能的。无法从另一个包导入
main
。这是一个很难的编译器规则,但即使不是这样,也不可能-main
是每个应用程序的入口点,因此任何导入main
的可访问包都会创建循环依赖关系。Go中没有全局变量。不过,更好的方法是依赖注入。将变量传递到需要它的函数中,而不是依赖于全局状态。全球国家(通常)是邪恶的。