201 Stimmen

Was bewirkt der '.' (Punkt oder Punkt) in einer Go-Import-Anweisung?

Im Go-Tutorial und in den meisten Go-Codes, die ich mir angesehen habe, werden Pakete wie folgt importiert:

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

Aber in http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go wird das gocheck-Paket mit einem . (Punkt):

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

Was ist die Bedeutung der . (Punkt)?

268voto

tvanfosson Punkte 506878

Damit können die Bezeichner im importierten Paket im lokalen Dateiblock ohne Qualifier referenziert werden.

Wenn ein expliziter Punkt (.) anstelle eines Namens erscheint, werden alle exportierten Bezeichner des Pakets im Dateiblock der aktuellen Datei deklariert und können ohne Qualifizierer aufgerufen werden.

Angenommen, wir haben ein Paket kompiliert, das die Paketklausel package math enthält, die die Funktion Sin exportiert, und haben das kompilierte Paket in der Datei mit der Bezeichnung "lib/math" installiert. Diese Tabelle veranschaulicht, wie auf Sin in Dateien zugegriffen werden kann, die das Paket nach den verschiedenen Arten von Import-Deklarationen importieren.

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

95voto

Evan Shaw Punkte 22186

Hier ist eine Analogie für diejenigen, die aus Python kommen:

  • Go's import "os" entspricht in etwa der Python-eigenen import os
  • Go's import . "os" entspricht in etwa der Python-eigenen from os import *

In beiden Sprachen ist die Verwendung des letzteren im Allgemeinen verpönt, aber es kann gute Gründe dafür geben.

14voto

Eli Davis Punkte 375

Dies sollte nur zu Testzwecken verwendet werden.

Hier ist einige Dokumentation in golang's wiki

Wenn Sie einen Mock-Code generiert haben, z.B. mit mockgen, und dieser Ihren Paketcode importiert, und dann Ihr Testpaket también Ihren Paketcode importiert, erhalten Sie eine zirkuläre Abhängigkeit (Etwas, das Golang dem Benutzer überlässt, wie es aufgelöst werden soll).

Wenn Sie jedoch innerhalb Ihres Testpakets die Punktnotation für das Paket, das Sie testen, verwenden, werden beide als dasselbe Paket behandelt und es gibt keine zirkuläre Abhängigkeit!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X