如何用Go语言导入和使用同名的不同软件包?


133

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

}

Answers:


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

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


4
JS以requireimport语句的清晰性钉住了它,比我见过的任何其他语言都好得多
Andy

@ r3wt:最好。语言。曾经!
马特·乔纳

1
没有最好的语言,只有语言的一些问题等,更好地
Inanc Gumus

16

Mostafa的回答是正确的,但是需要一些解释。让我尝试回答。

您的示例代码无效,因为您正试图导入两个具有相同名称的包,即“ 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}}`)
}

上面的代码为具有相同名称的导入软件包提供了两个不同的名称。所以,现在有两个不同的标识符,您可以使用:t对于text/template包,hhtml/template包。

您可以在操场上检查一下

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.