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}}`)
}
require
iimport
stwierdzeniami, o wiele lepiej niż w jakimkolwiek innym języku, jaki widziałemOdpowiedź 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
import
jest 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ć:
t
dlatext/template
pakietu ih
dlahtml/template
pakietu.Możesz to sprawdzić na placu zabaw .
źródło