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

时间:2012-05-02 06:18:42

标签: go packages

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

}

2 个答案:

答案 0 :(得分:219)

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

详细了解in the spec

答案 1 :(得分:6)

Mostafa的

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

它不起作用,因为:

import "html/template"
import "text/template"

在这些行中,您尝试导入两个具有相同名称的“模板” 程序包。

导入是声明

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

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

You can check it on the playground