代码之家  ›  专栏  ›  技术社区  ›  markhorrocks

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

go
  •  -2
  • markhorrocks  · 技术社区  · 7 年前

    Is it necessary to put templates into a map for reusing in Go?

    我之前在我的主包中声明了全局变量 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:未定义

    我意识到还有其他类似的问题,但答案并没有解决我的问题。我做错了什么?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Eli Bendersky    7 年前

    tmpl 将无法从另一个包中看到。要从其他包中导入变量,必须使用完全限定的名称引用它们,并使变量以大写字母开头, pack.Tmpl

    此外,也不可能从中导入变量 main 其他软件包。

        2
  •  0
  •   markhorrocks    7 年前

    这是我用于在助手包中声明模板的解决方案:

    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)
    ....
    }