162

例如,我想在一个源文件中同时使用 text/template 和 html/template。但是下面的代码会抛出错误。

import (
    "fmt"
    "net/http"
    "text/template" // template redeclared as imported package name
    "html/template" // template redeclared as imported package name
)

func handler_html(w http.ResponseWriter, r *http.Request) {
    t_html, err := html.template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
    t_text, err := text.template.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)

}
4

2 回答 2

299
import (
    "text/template"
    htemplate "html/template" // this is now imported as htemplate
)

在规范中阅读有关它的更多信息。

于 2012-05-02T06:24:50.067 回答
32

穆斯塔法的回答是正确的,但是需要一些解释。让我试着回答一下。

您的示例代码不起作用,因为您尝试导入两个具有相同名称的包,即:“模板”。

import "html/template"  // imports the package as `template`
import "text/template"  // imports the package as `template` (again)

导入是声明语句:

  • 您不能在同一范围内声明相同的名称(术语:标识符)。

  • 在 Go 中,import是一个声明,它的作用域是试图导入这些包的文件。

  • 它不起作用的原因与您不能在同一个块中声明具有相同名称的变量相同。

以下代码有效:

package main

import (
    t "text/template"
    h "html/template"
)

func main() {
    t.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
    h.New("foo").Parse(`{{define "T"}}Hello, {{.}}!{{end}}`)
}

上面的代码为导入的同名包提供了两个不同的名称。因此,您现在可以使用两种不同的标识符:t用于text/template包和h用于html/template包。

您可以在操场上查看

于 2018-07-03T19:01:41.303 回答