Cosa fa il '.' (punto o punto) in un'istruzione di importazione Go?


135

Nell'esercitazione Go e nella maggior parte del codice Go che ho visto, i pacchetti vengono importati in questo modo:

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

Ma in http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go , il pacchetto gocheck viene importato con un .(punto):

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

Qual è il significato del .(periodo)?


22
Nota, ho aggiunto punto e punto alla domanda per facilitare la ricerca.
Jared Farrish,

Risposte:


182

Consente di identificare gli identificatori nel pacchetto importato nel blocco di file locale senza un qualificatore.

Se viene visualizzato un punto esplicito (.) Anziché un nome, tutti gli identificativi esportati del pacchetto verranno dichiarati nel blocco di file del file corrente e sarà possibile accedervi senza un qualificatore.

Supponiamo di aver compilato un pacchetto contenente la clausola del pacchetto pacchetto matematico, che esporta la funzione Sin, e installato il pacchetto compilato nel file identificato da "lib / math". Questa tabella illustra come è possibile accedere a Sin nei file che importano il pacchetto dopo i vari tipi di dichiarazione di importazione.

Import declaration          Local name of Sin

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

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


29
Va notato che il team Go non consiglia di utilizzare l'importazione punti. Può causare un comportamento strano in alcuni casi e potrebbe non essere nella lingua indefinitamente.
jimt

Potrebbe essere fonte di confusione in alcuni scenari, ma non potevo sopportarlo usando go-linq. github.com/ahmetalpbalkan/go-linq
steviesama

Si noti che non è ancora possibile accedere alle funzioni non esportate (funzioni non maiuscole). Quindi questo modo di importare fa davvero schifo.
David 天宇 Wong,

1
Quando si compila un programma usando l'importazione dei punti e non l'uso dell'importazione dei punti. C'è un motivo per cui c'è un'enorme differenza se la dimensione del file compilato? L'uso di punti di importazione compila a dimensioni maggiori.
majidarif

@majidarif: Questa è un'osservazione interessante :) Potresti per favore postare una domanda separata per quello con il codice che riproduce il problema? (Ho provato a farlo da solo, compilando un semplice programma ciao-mondo con import "fmt"vs import . "fmt", ma in entrambi i casi aveva le stesse dimensioni per me.)
Attilio,

66

Ecco un'analogia per quelli provenienti da Python:

  • Go's import "os"è all'incirca equivalente a quello di Pythonimport os
  • Go's import . "os"è all'incirca equivalente a quello di Pythonfrom os import *

In entrambe le lingue, l'utilizzo di quest'ultimo è generalmente disapprovato ma ci possono essere buoni motivi per farlo.


4

Questo dovrebbe essere usato solo nei test.

Ecco alcuni documenti nel wiki di Golang

Se hai generato un codice falso come con mockgen e importa il codice del pacchetto, quindi il pacchetto di test importa anche il codice del pacchetto, ottieni una dipendenza circolare (Qualcosa che il Golang sceglie per consentire all'utente di decidere come risolverlo).

Tuttavia, se all'interno del pacchetto di test si utilizza la notazione punto sul pacchetto che si sta testando, vengono trattati come lo stesso pacchetto e non esiste alcuna dipendenza circolare!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.