Як імпортувати та використовувати різні пакети з однаковою назвою мовою 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: Найкраще. Мова. Колись!
Метт Столяр

1
Немає кращої мови, лише мови, які краще для деяких проблем тощо.
Inanc Gumus

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.