其他包中未定义html/template类型的Golang全局变量

其他包中未定义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

我已经按照这个问题的建议声明了一个全局var

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中没有全局变量。不过,更好的方法是依赖注入。将变量传递到需要它的函数中,而不是依赖于全局状态。全球国家(通常)是邪恶的。