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

}

Respostas:


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

Leia mais sobre isso nas especificações .


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 .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.