Как импортировать и использовать разные пакеты с одним и тем же именем на языке 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.