web-dev-qa-db-ja.com

Go言語で同じ名前の異なるパッケージをインポートして使用するには?

たとえば、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}}`)

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

詳細については、こちらをご覧ください 仕様で

232
Mostafa

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

プレイグラウンドで確認できます

10
Inanc Gumus