Go dilinde aynı isimli farklı paketler nasıl içe aktarılır ve kullanılır?


136

Örneğin, bir kaynak dosyada hem metin / şablon hem de html / şablon kullanmak istiyorum. Ancak aşağıdaki kod hata verir.

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

}

Yanıtlar:


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

Spesifikasyonda bunun hakkında daha fazlasını okuyun .


4
JS , gördüğüm diğer dillerden çok daha iyi olan netliği requireve importifadeleriyle onu çiviledi
— Andy

@ r3wt: En iyisi. Dil. Hiç!
— Matt Joiner

1
En iyi dil yoktur, sadece bazı problemler için daha iyi olan diller vs.
— İnanç Gümüş

17

Mostafa tarafından cevap doğru, ancak biraz açıklama gerektiriyor. Cevap vermeye çalışayım.

Örnek kodunuz çalışmıyor çünkü aynı ada sahip iki paketi içe aktarmaya çalışıyorsunuz, yani: "şablon".

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

İçe aktarma bir beyan ifadesidir:

  • Aynı adı ( terminoloji: tanımlayıcı ) aynı kapsamda bildiremezsiniz .

  • Go'da importbir bildiridir ve kapsamı, bu paketleri içe aktarmaya çalışan dosyadır.

  • Aynı blokta aynı ada sahip değişkenleri tanımlayamamanızla aynı nedenden dolayı çalışmaz.

Aşağıdaki kod çalışır:

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

Yukarıdaki kod, aynı ada sahip içe aktarılan paketlere iki farklı ad verir. : Yani, kullanabileceği iki farklı tanımlayıcılar şimdi vardır tiçin text/templatepaketin ve hiçin html/templatepaketin.

Oyun alanında kontrol edebilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.