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.