Wie importiere und verwende ich verschiedene gleichnamige Pakete in der Sprache Go?

133

Zum Beispiel möchte ich sowohl Text / Vorlage als auch HTML / Vorlage in einer Quelldatei verwenden. Aber der Code unten wirft Fehler.

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

}
HardPass
quelle

Antworten:

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

Lesen Sie mehr darüber in der Spezifikation .

Mostafa
quelle
4
JS hat es mit der Klarheit requireund importAussage genagelt , einfach so viel besser als alle anderen Sprachen, die ich gesehen habe
Andy
@ r3wt: Am besten. Sprache. Je!
Matt Joiner
1
Es gibt keine beste Sprache, nur Sprachen, die für einige Probleme besser sind usw.
Inanc Gumus
16

Die Antwort von Mostafa ist richtig, erfordert jedoch eine Erklärung. Lassen Sie mich versuchen, es zu beantworten.

Ihr Beispielcode funktioniert nicht, weil Sie versuchen, zwei Pakete mit demselben Namen zu importieren: "Vorlage".

import "html/template"  // imports the package as `template`
import "text/template"  // imports the package as `template` (again)

Der Import ist eine Deklarationserklärung:

  • Sie können nicht denselben Namen ( Terminologie: Bezeichner ) im selben Bereich deklarieren .

  • In Go importist eine Deklaration und ihr Gültigkeitsbereich ist die Datei, die versucht, diese Pakete zu importieren.

  • Dies funktioniert aus demselben Grund nicht, aus dem Sie keine Variablen mit demselben Namen im selben Block deklarieren können.

Der folgende Code funktioniert:

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

Der obige Code gibt den importierten Paketen mit demselben Namen zwei verschiedene Namen. Es gibt also zwei verschiedene Bezeichner, die Sie verwenden können: tfür das text/templatePaket und hfür das html/templatePaket.

Sie können es auf dem Spielplatz überprüfen .

Inanc Gumus
quelle