O que faz o '.' (ponto ou ponto) em uma declaração de importação Go, não é?

135

No tutorial Go, e na maior parte do código Go, os pacotes são importados assim:

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

Mas em http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go , o pacote gocheck é importado com um .(ponto):

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

Qual é o significado do .(período)?

Eric Seidel
fonte
22
Observe que adicionei ponto e ponto à pergunta para facilitar a pesquisa.
Jared Farrish

Respostas:

182

Ele permite que os identificadores no pacote importado sejam referidos no bloco de arquivos local sem um qualificador.

Se um período explícito (.) Aparecer em vez de um nome, todos os identificadores exportados do pacote serão declarados no bloco de arquivos do arquivo atual e poderão ser acessados ​​sem um qualificador.

Suponha que compilamos um pacote contendo a cláusula package package math, que exporta a função Sin e instalamos o pacote compilado no arquivo identificado por "lib / math". Esta tabela ilustra como o Sin pode ser acessado em arquivos que importam o pacote após os vários tipos de declaração de importação.

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
fonte
29
Observe que a equipe do Go não recomenda o uso da importação de pontos. Pode causar algum comportamento estranho em certos casos e pode não estar no idioma indefinidamente.
jimt
Pode ser confuso em alguns cenários, mas eu não aguentava usar o go-linq. github.com/ahmetalpbalkan/go-linq
steviesama
Observe que você ainda não pode obter acesso a funções não exportadas (funções não maiúsculas). Portanto, essa maneira de importar é realmente péssima.
David天宇Wong
1
Ao compilar um programa usando a importação de pontos vs não usando a importação de pontos. Existe uma razão para haver uma enorme diferença se o tamanho do arquivo compilado? O uso da importação de pontos é compilado para um tamanho maior.
majidarif
@majidarif: É uma observação interessante :) Você poderia postar uma pergunta separada para isso com o código que reproduz o problema? (Eu tentei fazer isso sozinho, compilar um programa Olá mundo simples com import "fmt"vs import . "fmt", mas em ambos os casos foi o mesmo tamanho para mim.)
Attilio
66

Aqui está uma analogia para quem vem do Python:

  • Go's import "os"é aproximadamente equivalente ao de Pythonimport os
  • Go's import . "os"é aproximadamente equivalente ao de Pythonfrom os import *

Nos dois idiomas, o uso desse último é geralmente desaprovado, mas pode haver boas razões para isso.

Evan Shaw
fonte
4

Isso deve ser usado apenas em testes.

Aqui está alguma documentação no wiki do golang

Se você gerou algum código simulado, como o mockgen, e ele importa o código do pacote, e o seu pacote de teste também importa o código do pacote, você recebe uma dependência circular (algo que o golang escolhe para permitir que o usuário decida como resolver).

No entanto, se dentro do seu pacote de teste você usar notação de ponto no pacote que está testando, eles serão tratados como o mesmo pacote e não haverá dependência circular!

Eli Davis
fonte