Como importar e usar pacotes diferentes com o mesmo nome no idioma Go?

133

Por exemplo, eu quero usar texto / modelo e html / modelo em um arquivo de origem. Mas o código abaixo gera erros.

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

}
hardPass
fonte

Respostas:

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

Leia mais sobre isso nas especificações .

Mostafa
fonte
4
JS acertou em cheio com a clareza de requiree importdeclarações, apenas muito melhor do que quaisquer outras línguas que eu já vi
Andy
@ r3wt: Melhor. Língua. Sempre!
Matt Joiner
1
Não há melhor idioma, apenas idiomas são melhores para alguns problemas, etc.
Inanc Gumus 09/03
16

A resposta de Mostafa está correta, porém exige alguma explicação. Deixe-me tentar responder.

Seu código de exemplo não funciona porque você está tentando importar dois pacotes com o mesmo nome, que é: "template".

import "html/template"  // imports the package as `template`
import "text/template"  // imports the package as `template` (again)

Importar é uma declaração de declaração:

  • Você não pode declarar o mesmo nome ( terminologia: identificador ) no mesmo escopo.

  • No Go, importé uma declaração e seu escopo é o arquivo que está tentando importar esses pacotes.

  • Não funciona pelo mesmo motivo que você não pode declarar variáveis ​​com o mesmo nome no mesmo bloco.

O código a seguir funciona:

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

O código acima fornece dois nomes diferentes para os pacotes importados com o mesmo nome. Portanto, agora existem dois identificadores diferentes que você pode usar: tpara o text/templatepacote e hpara o html/templatepacote.

Você pode verificá-lo no parquinho .

Inanc Gumus
fonte