อะไร '.' (จุดหรือจุด) ในคำสั่ง Go import ทำอย่างไร


143

ในบทช่วยสอน Go และรหัส Go ส่วนใหญ่ที่ฉันดูแพ็คเกจจะถูกนำเข้าเช่นนี้:

import (
    "fmt"
    "os"
    "launchpad.net/lpad"
    ...
)

แต่ในhttp://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.goจะมีการนำเข้าแพ็คเกจ gocheck ด้วย.(จุด):

import (
    "http"
    . "launchpad.net/gocheck"
    "launchpad.net/lpad"
    "os"    
)

ความสำคัญของ.(period) คืออะไร?


22
หมายเหตุฉันเพิ่มจุดและจุดลงในคำถามเพื่อให้ค้นหาได้ง่ายขึ้น
Jared Farrish

คำตอบ:


193

ช่วยให้ตัวระบุในแพ็กเกจที่นำเข้าสามารถอ้างถึงในบล็อกไฟล์ภายในเครื่องโดยไม่มีคุณสมบัติ

หากช่วงเวลาที่ชัดเจน (.) ปรากฏขึ้นแทนชื่อตัวระบุที่ส่งออกทั้งหมดของแพ็กเกจจะถูกประกาศในบล็อกไฟล์ของไฟล์ปัจจุบันและสามารถเข้าถึงได้โดยไม่ต้องมีคุณสมบัติ

สมมติว่าเราได้รวบรวมแพ็กเกจที่มีคณิตศาสตร์แพคเกจประโยคคำสั่งซึ่งส่งออกฟังก์ชัน Sin และติดตั้งแพ็กเกจที่คอมไพล์แล้วในไฟล์ที่ระบุโดย "lib / math" ตารางนี้แสดงวิธีการเข้าถึง Sin ในไฟล์ที่อิมพอร์ตแพ็กเกจหลังจากการประกาศอิมพอร์ตประเภทต่างๆ

Import declaration          Local name of Sin

import   "lib/math"         math.Sin
import M "lib/math"         M.Sin
import . "lib/math"         Sin

อ้างอิง: http://golang.org/doc/go_spec.html#Import_declarations


30
ควรสังเกตว่าทีม Go ไม่แนะนำให้ใช้การนำเข้าจุด อาจทำให้เกิดพฤติกรรมแปลก ๆ ในบางกรณีและอาจไม่อยู่ในภาษานั้น ๆ ไปเรื่อย ๆ
jimt

1
อาจจะสับสนในบางสถานการณ์ แต่ฉันไม่สามารถทนได้ในการใช้ go-linq github.com/ahmetalpbalkan/go-linq
steviesama

โปรดทราบว่าคุณยังไม่สามารถเข้าถึงฟังก์ชันที่ไม่ได้ส่งออก (ฟังก์ชันที่ไม่ใช่ตัวพิมพ์ใหญ่) วิธีการนำเข้าแบบนี้แย่มาก
David 天宇 Wong

1
เมื่อคอมไพล์โปรแกรมโดยใช้ dot import เทียบกับไม่ใช้ dot import มีเหตุผลว่าทำไมขนาดไฟล์ที่คอมไพล์แตกต่างกันมาก? การใช้ dot import จะคอมไพล์ให้ใหญ่ขึ้น
majidarif

@majidarif: นั่นเป็นข้อสังเกตที่น่าสนใจ :) คุณช่วยโพสต์คำถามแยกต่างหากพร้อมรหัสที่ทำให้เกิดปัญหาได้หรือไม่? (ฉันพยายามทำด้วยตัวเองรวบรวมโปรแกรม hello-world ง่ายๆกับimport "fmt"vs import . "fmt"แต่ในทั้งสองกรณีมันมีขนาดเท่ากันสำหรับฉัน)
Attilio

67

นี่เป็นการเปรียบเทียบสำหรับผู้ที่มาจาก Python:

  • Go's import "os"เทียบเท่ากับ Pythonimport os
  • Go's import . "os"เทียบเท่ากับ Pythonfrom os import *

ในทั้งสองภาษาการใช้คำหลังมักจะขมวดคิ้ว แต่อาจมีเหตุผลที่ดีในการทำเช่นนั้น


4

ควรใช้ในการทดสอบเท่านั้น

นี่คือเอกสารบางส่วนในวิกิของ golang

หากคุณได้สร้างรหัสจำลองบางอย่างเช่นกับ mockgen และนำเข้ารหัสแพคเกจของคุณแล้วแพคเกจการทดสอบของคุณนอกจากนี้ยังนำเข้ารหัสแพคเกจของคุณคุณจะได้รับการพึ่งพาวงกลม (บางสิ่งบางอย่าง Chooses golang เพื่อให้ผู้ใช้ตัดสินใจว่าจะแก้ปัญหา)

อย่างไรก็ตามหากภายในแพ็กเกจการทดสอบของคุณคุณใช้สัญกรณ์จุดบนแพ็กเกจที่คุณกำลังทดสอบจะถือว่าเป็นแพ็กเกจเดียวกันและไม่มีการพึ่งพาแบบวงกลม!

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