如何导入和使用同名的不同包

例如,我想在一个源文件中同时使用 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}}`)


}
75597 次浏览
import (
"text/template"
htemplate "html/template" // this is now imported as htemplate
)

阅读更多有关它 在规格中

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

您的示例代码无法工作,因为您试图导入两个具有相同名称的包,即: “ template”。

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

上面的代码为具有相同名称的导入包提供了两个不同的名称。因此,现在可以使用两个不同的标识符: text/template包使用 thtml/template包使用 h

你可以在操场上查看。