Come importare e utilizzare diversi pacchetti con lo stesso nome nella lingua Go?


133

Ad esempio, voglio usare sia text / template sia html / template in un file sorgente. Ma il codice qui sotto genera errori.

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

}

Risposte:


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

Leggi di più a riguardo nelle specifiche .


4
JS l'ha inchiodato con la chiarezza requiree le importdichiarazioni, semplicemente molto meglio di qualsiasi altra lingua che abbia mai visto
Andy,

@ r3wt: il migliore. Linguaggio. Mai!
Matt Joiner,

1
Non esiste la lingua migliore, solo le lingue migliori per alcuni problemi, ecc.
Inanc Gumus

16

La risposta di Mostafa è corretta, tuttavia richiede alcune spiegazioni. Vorrei provare a rispondere.

Il tuo codice di esempio non funziona perché stai cercando di importare due pacchetti con lo stesso nome, che è: "template".

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

L'importazione è una dichiarazione dichiarazione:

  • Non è possibile dichiarare lo stesso nome ( terminologia: identificatore ) nello stesso ambito.

  • In Go, importè una dichiarazione e il suo ambito è il file che sta tentando di importare quei pacchetti.

  • Non funziona per lo stesso motivo per cui non è possibile dichiarare variabili con lo stesso nome nello stesso blocco.

Il seguente codice funziona:

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

Il codice sopra riportato dà due nomi diversi ai pacchetti importati con lo stesso nome. Quindi, ora ci sono due identificatori diversi che è possibile utilizzare: tper il text/templatepacchetto e hper il html/templatepacchetto.

Puoi controllarlo nel parco giochi .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.