Co oznacza „.” (kropka lub kropka) w instrukcji importu Go zrobić?

135

W samouczku Go i większości kodu Go, który przeglądałem, pakiety są importowane w następujący sposób:

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

Ale w http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go pakiet gocheck jest importowany z .(kropką):

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

Jakie jest znaczenie .(okres)?

Eric Seidel
źródło
22
Uwaga: dodałem kropkę i kropkę do pytania, aby ułatwić wyszukiwanie.
Jared Farrish,

Odpowiedzi:

182

Pozwala na odwoływanie się do identyfikatorów w zaimportowanym pakiecie w lokalnym bloku pliku bez kwalifikatora.

Jeśli zamiast nazwy pojawi się wyraźna kropka (.), Wszystkie wyeksportowane identyfikatory pakietu zostaną zadeklarowane w bloku pliku bieżącego pliku i będą dostępne bez kwalifikatora.

Załóżmy, że skompilowaliśmy pakiet zawierający klauzulę pakiet math, która eksportuje funkcję Sin, i zainstalowaliśmy skompilowany pakiet w pliku oznaczonym jako „lib / math”. Ta tabela ilustruje, w jaki sposób można uzyskać dostęp do Sin w plikach, które importują pakiet po różnych typach deklaracji importu.

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
źródło
29
Należy zauważyć, że zespół Go nie zaleca używania importu kropkowego. W niektórych przypadkach może powodować dziwne zachowanie i może nie być w języku przez czas nieokreślony.
jimt
W niektórych sytuacjach może to być mylące, ale nie mogłem tego znieść, używając go-linq. github.com/ahmetalpbalkan/go-linq
steviesama
Zauważ, że nadal nie możesz uzyskać dostępu do nieeksportowanych funkcji (funkcji innych niż wielkie litery). Tak więc ten sposób importowania jest naprawdę do niczego.
David 天宇 Wong
1
Podczas kompilowania programu przy użyciu importu kropkowego a nie importu kropkowego. Czy istnieje powód, dla którego istnieje ogromna różnica w wielkości skompilowanego pliku? Korzystanie z importu kropkowego kompiluje do większego rozmiaru.
majidarif
@majidarif: To interesująca obserwacja :) Czy możesz zadać osobne pytanie na ten temat z kodem, który odtwarza problem? (Próbowałem to zrobić sam, kompilując prosty program hello-world z import "fmt"vs import . "fmt", ale w obu przypadkach był to ten sam rozmiar dla mnie.)
Attilio
66

Oto analogia dla tych pochodzących z Pythona:

  • Go import "os"jest z grubsza odpowiednikiem Pythonaimport os
  • Go import . "os"jest z grubsza odpowiednikiem Pythonafrom os import *

W obu językach używanie tego drugiego jest generalnie źle widziane, ale mogą być ku temu dobre powody.

Evan Shaw
źródło
4

Powinno to być używane tylko w testach.

Oto dokumentacja na wiki golanga

Jeśli wygenerowałeś jakiś fałszywy kod, taki jak mockgen, i importuje on twój kod pakietu, a następnie twój pakiet testowy również importuje kod pakietu, otrzymujesz zależność cykliczną (coś, co golang decyduje, aby użytkownik zdecydował, jak rozwiązać).

Jednakże, jeśli wewnątrz pakietu testowego używasz notacji kropkowej na testowanym pakiecie, są one traktowane jako ten sam pakiet i nie ma zależności cyklicznej!

Eli Davis
źródło