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

}

Odpowiedzi:


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

Przeczytaj więcej na ten temat w specyfikacji .


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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.