Bagaimana cara mengimpor dan menggunakan paket berbeda dengan nama yang sama dalam bahasa Go?

133

Sebagai contoh, saya ingin menggunakan teks / templat dan html / templat dalam satu file sumber. Namun kode di bawah ini membuang kesalahan.

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
sumber

Jawaban:

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

Baca lebih lanjut di spec .

Mostafa
sumber
4
JS memahaminya dengan kejelasan requiredan importpernyataan, jauh lebih baik daripada bahasa lain yang pernah saya lihat
Andy
@ r3wt: Terbaik. Bahasa. Pernah!
Matt Joiner
1
Tidak ada bahasa terbaik, hanya bahasa yang lebih baik untuk beberapa masalah, dll.
Inanc Gumus
16

Jawaban oleh Mostafa benar, namun menuntut beberapa penjelasan. Biarkan saya mencoba menjawabnya.

Contoh kode Anda tidak berfungsi karena Anda mencoba mengimpor dua paket dengan nama yang sama, yaitu: "template".

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

Mengimpor adalah pernyataan deklarasi:

  • Anda tidak dapat mendeklarasikan nama yang sama ( terminologi: pengidentifikasi ) dalam cakupan yang sama.

  • In Go, importadalah deklarasi dan cakupannya adalah file yang mencoba mengimpor paket-paket itu.

  • Itu tidak berfungsi karena alasan yang sama bahwa Anda tidak dapat mendeklarasikan variabel dengan nama yang sama di blok yang sama.

Kode berikut berfungsi:

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

Kode di atas memberikan dua nama berbeda untuk paket yang diimpor dengan nama yang sama. Jadi, sekarang ada dua pengidentifikasi berbeda yang dapat Anda gunakan: tuntuk text/templatepaket, dan huntuk html/templatepaket.

Anda bisa memeriksanya di taman bermain .

Inanc Gumus
sumber