Jak importować i używać różnych pakietów o tej samej nazwie

145

Na przykład chcę użyć zarówno tekstu / szablonu, jak i html / szablonu w jednym pliku źródłowym. Ale poniższy kod generuje błędy.

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
źródło

Odpowiedzi:

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

Przeczytaj więcej na ten temat w specyfikacji .

Mostafa
źródło
4
JS przybrał to klarownością requirei importstwierdzeniami, o wiele lepiej niż w jakimkolwiek innym języku, jaki widziałem
Andy
@ r3wt: Best. Język. Zawsze!
Matt Joiner
1
Nie ma najlepszego języka, tylko języki lepsze dla niektórych problemów itp.
Inanc Gumus
19

Odpowiedź Mostafy jest poprawna, wymaga jednak wyjaśnienia. Spróbuję odpowiedzieć.

Twój przykładowy kod nie działa, ponieważ próbujesz zaimportować dwa pakiety o tej samej nazwie, czyli: „szablon”.

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

Import to deklaracja deklaracji:

  • Nie możesz zadeklarować tej samej nazwy ( terminologia: identyfikator ) w tym samym zakresie.

  • W Go importjest deklaracją, a jej zakresem jest plik, który próbuje zaimportować te pakiety.

  • To nie działa z tego samego powodu, dla którego nie możesz zadeklarować zmiennych o tej samej nazwie w tym samym bloku.

Poniższy kod działa:

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

Powyższy kod nadaje dwie różne nazwy zaimportowanym pakietom o tej samej nazwie. Tak więc są teraz dwa różne identyfikatory, których możesz użyć: tdla text/templatepakietu i hdla html/templatepakietu.

Możesz to sprawdzić na placu zabaw .

Inanc Gumus
źródło