Apa '.' (titik atau titik) dalam pernyataan impor Go do?

143

Dalam tutorial Go, dan sebagian besar kode Go yang telah saya lihat, paket diimpor seperti ini:

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

Namun di http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go , paket gocheck diimpor dengan .(titik):

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

Apa pentingnya .(periode)?

Eric Seidel
sumber
22
Perhatikan, saya menambahkan titik dan titik ke pertanyaan agar lebih mudah untuk mencari.
Jared Farrish

Jawaban:

193

Ini memungkinkan pengidentifikasi dalam paket yang diimpor untuk dirujuk di blok file lokal tanpa kualifikasi.

Jika titik eksplisit (.) Muncul sebagai ganti nama, semua pengidentifikasi paket yang diekspor akan dideklarasikan di blok file saat ini dan dapat diakses tanpa qualifier.

Asumsikan kita telah mengkompilasi paket yang berisi paket klausa matematika paket, yang mengekspor fungsi Sin, dan menginstal paket yang dikompilasi dalam file yang diidentifikasi oleh "lib / math". Tabel ini menggambarkan bagaimana Sin dapat diakses dalam file yang mengimpor paket setelah berbagai jenis deklarasi impor.

Import declaration          Local name of Sin

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

Ref: http://golang.org/doc/go_spec.html#Import_declarations

tvanfosson.dll
sumber
30
Perlu dicatat bahwa tim Go tidak merekomendasikan penggunaan impor titik. Ini dapat menyebabkan beberapa perilaku aneh dalam kasus tertentu dan mungkin tidak dalam bahasa yang tidak terbatas.
jimt
1
Ini mungkin membingungkan dalam beberapa skenario, tetapi saya tidak tahan menggunakan go-linq. github.com/ahmetalpbalkan/go-linq
steviesama
Perhatikan bahwa Anda masih tidak bisa mendapatkan akses ke fungsi yang tidak diekspor (fungsi non-huruf besar). Jadi cara mengimpor ini sangat menyebalkan.
David 天宇 Wong
1
Saat menyusun program menggunakan dot import vs tidak menggunakan dot import. Apakah ada alasan mengapa ada perbedaan besar jika ukuran file yang dikompilasi? Menggunakan dot import mengkompilasi ke ukuran yang lebih besar.
majidarif
@majidarif: Itu pengamatan yang menarik :) Bisakah Anda memposting pertanyaan terpisah untuk itu dengan kode yang mereproduksi masalah? (Saya mencoba melakukannya sendiri, menyusun program hello-world sederhana dengan import "fmt"vs import . "fmt", tetapi dalam kedua kasus ukurannya sama untuk saya.)
Attilio
67

Berikut analogi mereka yang berasal dari Python:

  • Go import "os"kira-kira setara dengan Pythonimport os
  • Go import . "os"kira-kira setara dengan Pythonfrom os import *

Dalam kedua bahasa, menggunakan yang terakhir umumnya tidak disukai tetapi ada alasan bagus untuk melakukannya.

Evan Shaw
sumber
4

Ini hanya boleh digunakan dalam pengujian.

Berikut adalah beberapa dokumentasi di wiki golang

Jika Anda telah membuat beberapa kode tiruan seperti dengan mockgen dan itu mengimpor kode paket Anda, dan kemudian paket pengujian Anda juga mengimpor kode paket Anda, Anda mendapatkan ketergantungan melingkar (Sesuatu golang memilih untuk membiarkan pengguna memutuskan bagaimana menyelesaikannya).

Namun, jika di dalam paket pengujian Anda menggunakan notasi titik pada paket yang Anda uji maka paket tersebut diperlakukan sebagai paket yang sama dan tidak ada ketergantungan melingkar yang bisa didapat!

Eli Davis
sumber