Làm cách nào để nhập và sử dụng các gói khác nhau cùng tên trong ngôn ngữ Go?


133

Ví dụ: tôi muốn sử dụng cả văn bản / mẫu và html / mẫu trong một tệp nguồn. Nhưng mã dưới đây ném lỗi.

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

}

Câu trả lời:


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

Đọc thêm về nó trong spec .


4
JS đóng đinh nó với sự rõ ràng requirevà các importtuyên bố, tốt hơn nhiều so với bất kỳ ngôn ngữ nào tôi đã thấy
Andy

@ r3wt: Tốt nhất. Ngôn ngữ. Không bao giờ!
Matt Tham gia

1
Không có ngôn ngữ tốt nhất, chỉ có ngôn ngữ tốt hơn cho một số vấn đề, v.v.
Inanc Gumus

16

Trả lời bởi Mostafa là chính xác, tuy nhiên nó đòi hỏi một số lời giải thích. Hãy để tôi cố gắng trả lời nó.

Mã ví dụ của bạn không hoạt động vì bạn đang cố nhập hai gói có cùng tên, đó là: "mẫu".

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

Nhập khẩu là một tuyên bố khai báo:

  • Bạn không thể khai báo cùng tên ( thuật ngữ: định danh ) trong cùng phạm vi.

  • Trong Go, importlà một khai báo và phạm vi của nó là tệp đang cố gắng nhập các gói đó.

  • Nó không hoạt động vì cùng một lý do mà bạn không thể khai báo các biến có cùng tên trong cùng một khối.

Các mã sau hoạt động:

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

Mã ở trên cung cấp hai tên khác nhau cho các gói nhập khẩu có cùng tên. Vì vậy, hiện có hai định danh khác nhau mà bạn có thể sử dụng: tcho text/templategói và hcho html/templategói.

Bạn có thể kiểm tra nó trên sân chơi .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.