วิธีการนำเข้าและใช้แพ็คเกจอื่นที่มีชื่อเดียวกัน


145

ตัวอย่างเช่นฉันต้องการใช้ทั้งข้อความ / เทมเพลตและ html / template ในไฟล์ต้นฉบับเดียว แต่โค้ดด้านล่างทำให้เกิดข้อผิดพลาด

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

}

คำตอบ:


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

อ่านข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ในสเปค


4
JS ตอกด้วยความชัดเจนrequireและimportข้อความดีกว่าภาษาอื่น ๆ ที่ฉันเคยเห็นมาก
Andy

@ r3wt: ดีที่สุด ภาษา. เคย!
Matt Joiner

1
ไม่มีภาษาที่ดีที่สุดมีเพียงภาษาที่ดีกว่าสำหรับปัญหาบางอย่างเป็นต้น
Inanc Gumus

19

คำตอบของ Mostafa นั้นถูกต้อง แต่ต้องมีคำอธิบาย ให้ฉันลองตอบมัน

โค้ดตัวอย่างของคุณใช้ไม่ได้เนื่องจากคุณกำลังพยายามนำเข้าสองแพ็กเกจที่มีชื่อเดียวกันซึ่งก็คือ "เทมเพลต"

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

การนำเข้าเป็นคำสั่งประกาศ:

  • คุณไม่สามารถประกาศชื่อเดียวกัน ( ศัพท์เฉพาะ: ตัวระบุ ) ในขอบเขตเดียวกันได้

  • ใน Go importเป็นการประกาศและขอบเขตคือไฟล์ที่พยายามนำเข้าแพ็กเกจเหล่านั้น

  • ไม่ได้ผลเนื่องจากเหตุผลเดียวกับที่คุณไม่สามารถประกาศตัวแปรที่มีชื่อเดียวกันในบล็อกเดียวกันได้

รหัสต่อไปนี้ใช้งานได้:

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

รหัสด้านบนให้ชื่อที่แตกต่างกันสองชื่อสำหรับแพ็กเกจที่นำเข้าที่มีชื่อเดียวกัน ดังนั้นตอนนี้มีตัวระบุสองตัวที่แตกต่างกันที่คุณสามารถใช้ได้: tสำหรับtext/templateแพ็คเกจและhสำหรับhtml/templateแพ็คเกจ

คุณสามารถตรวจสอบในสนามเด็กเล่น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.