web-dev-qa-db-fra.com

Comment importer et utiliser différents packages du même nom en langue Go?

Par exemple, je souhaite utiliser à la fois text/template et html/template dans un fichier source. Mais le code ci-dessous jette des erreurs.

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

}
120
hardPass
import (
    "text/template"
    htemplate "html/template" // this is now imported as htemplate
)

En savoir plus à ce sujet dans la spécification .

232
Mostafa

La réponse de Mostafa est correcte, mais nécessite quelques explications. Laissez-moi essayer d'y répondre.

Cela ne fonctionne pas car:

import "html/template"
import "text/template"

Dans ces lignes, vous essayez d'importer deux "modèles" packages avec le même nom.

Importer est une déclaration

  • Vous ne pouvez pas déclarer le même nom ( terminology: identifier) dans la même portée.

  • Dans Go, import est une déclaration et sa portée est le fichier qui tente d'importer ces packages.

  • Cela ne fonctionne pas pour la même raison que vous ne pouvez pas déclarer des variables du même nom dans le même bloc.

C'est la raison pour laquelle cela fonctionne

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

Vous pouvez le vérifier sur le terrain de je .

10
Inanc Gumus