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


133

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

}

回答:


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

詳細については、仕様をご覧ください。


4
JSは明確なrequireand importステートメントでそれを釘付けにしました。これは、私が見た他のどの言語よりもはるかに優れています
Andy

@ r3wt:最高です。言語。今まで!
マットジョイナー2018年

1
いくつかの問題などのためのより良い何の最高の言語、唯一の言語がありません
Inanc Gumus

16

モスタファの答えは正しいですが、説明が必要です。答えさせてください。

同じ名前の2つのパッケージをインポートしようとしているため、サンプルコードは機能しません: "テンプレート"。

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

上記のコードは、同じ名前のインポートされたパッケージに2つの異なる名前を付けます。:だから、あなたが使用できる2つの異なる識別子今があるtためtext/template、パッケージ、およびhのためのhtml/templateパッケージが。

遊び場で確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.