¿Cómo importar y usar diferentes paquetes del mismo nombre en el idioma Go?

133

Por ejemplo, quiero usar tanto text / template como html / template en un archivo fuente. Pero el siguiente código arroja errores.

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
fuente

Respuestas:

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

Lea más sobre esto en la especificación .

Mostafa
fuente
44
JS lo logró con la claridad requirey las importdeclaraciones, mucho mejor que cualquier otro idioma que haya visto
Andy
@ r3wt: mejor. Idioma. ¡Nunca!
Matt Joiner
1
No hay mejor idioma, solo idiomas mejores para algunos problemas, etc.
Inanc Gumus
16

La respuesta de Mostafa es correcta, sin embargo, requiere alguna explicación. Déjame intentar responderlo.

Su código de ejemplo no funciona porque está intentando importar dos paquetes con el mismo nombre, que es: "plantilla".

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

Importar es una declaración de declaración:

  • No puede declarar el mismo nombre ( terminología: identificador ) en el mismo ámbito.

  • En Go, importhay una declaración y su alcance es el archivo que está tratando de importar esos paquetes.

  • No funciona debido a la misma razón por la que no puede declarar variables con el mismo nombre en el mismo bloque.

El siguiente código 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}}`)
}

El código anterior proporciona dos nombres diferentes a los paquetes importados con el mismo nombre. Por lo tanto, ahora hay dos identificadores diferentes que puede usar: tpara el text/templatepaquete y hpara el html/templatepaquete.

Puedes consultarlo en el parque infantil .

Inanc Gumus
fuente