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

133

Par exemple, je souhaite utiliser à la fois texte / modèle et html / modèle dans un fichier source. Mais le code ci-dessous génère 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}}`)

}
hardPass
la source

Réponses:

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

En savoir plus à ce sujet dans les spécifications .

Mostafa
la source
4
JS l'a cloué avec la clarté requireet les importdéclarations, tellement mieux que toutes les autres langues que j'ai vues
Andy
@ r3wt: le meilleur. Langue. Déjà!
Matt Joiner
1
Il n'y a pas de meilleure langue, seulement des langues meilleures pour certains problèmes, etc.
Inanc Gumus
16

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

Votre exemple de code ne fonctionne pas car vous essayez d'importer deux packages avec le même nom, qui est: "template".

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

L'importation est une déclaration de déclaration:

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

  • Dans Go, il importy a 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 de variables avec le même nom dans le même bloc.

Le code suivant 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}}`)
}

Le code ci-dessus donne deux noms différents aux packages importés avec le même nom. Il existe donc maintenant deux identifiants différents que vous pouvez utiliser: tpour le text/templatepackage et hpour le html/templatepackage.

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

Inanc Gumus
la source