Как импортировать и использовать разные пакеты с одним и тем же именем на языке Go?


133

Например, я хочу использовать как текст / шаблон, так и html / шаблон в одном исходном файле. Но приведенный ниже код вызывает ошибки.

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 сделал это с ясностью requireи ясностью importформулировок, намного лучше, чем любые другие языки, которые я видел
Энди

@ r3wt: Лучше. Язык. Когда-либо!
Matt Joiner

1
Нет лучшего языка, только языки, которые лучше
подходят

16

Ответ Мостафы правильный, но требует пояснений. Позвольте мне попытаться ответить на него.

Ваш пример кода не работает, потому что вы пытаетесь импортировать два пакета с одинаковым именем, а именно: «шаблон».

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

Приведенный выше код дает два разных имени импортированным пакетам с одинаковым именем. Итак, теперь есть два разных идентификатора, которые вы можете использовать: tдля text/templateпакета и hдля html/templateпакета.

Вы можете проверить это на детской площадке .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.