たとえば、1つのソースファイルで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}}`)
}
import (
"text/template"
htemplate "html/template" // this is now imported as htemplate
)
詳細については、こちらをご覧ください 仕様で 。
Mostafaの回答は正しいですが、説明が必要です。答えてみましょう。
次の理由で機能しません:
import "html/template"
import "text/template"
これらの行では、同じ名前の2つの "template"パッケージをインポートしようとしています。
インポートは宣言です
同じスコープ内で同じ名前(terminology:identifier)を宣言することはできません。
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}}`)
}