Ne yapar '.' (nokta veya nokta) Go alma deyiminde?


136

Git eğitiminde ve baktığım Go kodunun çoğunda paketler şu şekilde içe aktarılır:

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

Ancak http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go adresinde , gocheck paketi .(nokta) ile içe aktarılır :

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

.(Dönemin) önemi nedir ?


22
Not, aramayı kolaylaştırmak için soruya nokta ve nokta ekledim.
Jared Farrish

Yanıtlar:


182

İçe aktarılan paketteki tanımlayıcılara niteleyici olmadan yerel dosya bloğunda atıfta bulunulmasını sağlar.

Ad yerine açık bir nokta (.) Görünürse, paketin dışa aktarılan tüm tanımlayıcıları geçerli dosyanın dosya bloğunda bildirilir ve niteleyici olmadan erişilebilir.

Sin fonksiyonunu veren paket cümlesi paketi math'u içeren bir paket derlediğimizi ve derlenen paketi "lib / math" ile tanımlanan dosyaya kurduğumuzu varsayalım. Bu tablo, çeşitli içe aktarma bildirimi türlerinden sonra paketi içe aktaran dosyalarda Sin'e nasıl erişilebileceğini gösterir.

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


29
Go ekibinin nokta içe aktarmayı kullanmanızı önermediğine dikkat edilmelidir. Bazı durumlarda tuhaf davranışlara neden olabilir ve süresiz olarak dilde olmayabilir.
jimt

Bazı senaryolarda kafa karıştırıcı olabilir, ancak go-linq kullanarak dayanamadım. github.com/ahmetalpbalkan/go-linq
steviesama

Dışa aktarılmayan işlevlere (büyük harf olmayan işlevler) hala erişemeyeceğinizi unutmayın. Yani bu ithal yöntemi gerçekten berbat.
David 天宇 Wong

1
Dot import kullanarak bir programı derlerken, dot import kullanarak değil. Derlenmiş dosya boyutu çok büyük bir nedeni var mı? Nokta içe aktarma derlemelerini daha büyük boyuta getirmek.
majidarif

@majidarif: Bu ilginç bir gözlem :) Sorunu yeniden üreten kodla bunun için ayrı bir soru gönderir misiniz? (Bunu kendim yapmaya çalıştım, import "fmt"vs ile basit bir merhaba dünya programı derledim import . "fmt", ama her iki durumda da benim için aynı
Attilio

66

İşte Python'dan gelenler için bir benzetme:

  • Go's import "os"kabaca Python's ile eşdeğerdirimport os
  • Go's import . "os"kabaca Python's ile eşdeğerdirfrom os import *

Her iki dilde de, ikincisini kullanmak genellikle kaşlarını çattı, ancak bunu yapmak için iyi nedenler olabilir.


4

Bu sadece testlerde kullanılmalıdır.

İşte golang'ın wiki'sindeki bazı belgeler

Eğer mockgen gibi bazı sahte kodlar oluşturduysanız ve paket kodunuzu içeri aktarıyorsa, o zaman test paketiniz de paket kodunuzu içeri aktarıyorsa, dairesel bir bağımlılık elde edersiniz (Golang, kullanıcının nasıl çözüleceğine karar vermesine izin vermeyi seçer).

Ancak, test paketinizin içinde test ettiğiniz paket üzerinde nokta gösterimi kullanıyorsanız, bunlar aynı paket olarak kabul edilir ve dairesel bir bağımlılık yoktur!

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.