Lo que hace el '.' (punto o punto) en una declaración de importación Go hacer?

135

En el tutorial Go, y la mayoría del código Go que he visto, los paquetes se importan así:

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

Pero en http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go , el paquete gocheck se importa con un .(punto):

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

¿Cuál es el significado del .(punto)?

Eric Seidel
fuente
22
Tenga en cuenta que agregué punto y punto a la pregunta para que sea más fácil buscar.
Jared Farrish

Respuestas:

182

Permite hacer referencia a los identificadores en el paquete importado en el bloque de archivos local sin un calificador.

Si aparece un punto explícito (.) En lugar de un nombre, todos los identificadores exportados del paquete se declararán en el bloque de archivos del archivo actual y se podrá acceder sin un calificador.

Supongamos que hemos compilado un paquete que contiene la cláusula package package math, que exporta la función Sin, e instaló el paquete compilado en el archivo identificado por "lib / math". Esta tabla ilustra cómo se puede acceder a Sin en archivos que importan el paquete después de los diversos tipos de declaración de importación.

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
fuente
29
Cabe señalar que el equipo de Go no recomienda usar la importación de puntos. Puede causar un comportamiento extraño en ciertos casos y puede no estar en el idioma indefinidamente.
jimt
Puede ser confuso en algunos escenarios, pero no podría soportar usar go-linq. github.com/ahmetalpbalkan/go-linq
steviesama
Tenga en cuenta que aún no puede obtener acceso a funciones no exportadas (funciones no mayúsculas). Entonces, esta forma de importar realmente apesta.
David 天宇 Wong
1
Al compilar un programa usando la importación de puntos versus no usar la importación de puntos. ¿Hay alguna razón por la cual hay una gran diferencia si el tamaño del archivo compilado? El uso de la importación de puntos compila a un tamaño más grande.
majidarif
@majidarif: Esa es una observación interesante :) ¿Podría publicar una pregunta por separado con código que reproduzca el problema? (Traté de hacerlo yo mismo, compilando un programa simple de hello-world con import "fmt"vs import . "fmt", pero en ambos casos fue del mismo tamaño para mí).
Attilio
66

Aquí hay una analogía para aquellos que vienen de Python:

  • Go's import "os"es más o menos equivalente a Pythonimport os
  • Go's import . "os"es más o menos equivalente a Pythonfrom os import *

En ambos idiomas, usar el último generalmente está mal visto, pero puede haber buenas razones para hacerlo.

Evan Shaw
fuente
4

Esto solo debe usarse en las pruebas.

Aquí hay alguna documentación en el wiki de Golang

Si ha generado un código simulado como con mockgen e importa el código de su paquete, y luego su paquete de prueba también importa su código de paquete, obtendrá una dependencia circular (Algo golang elige permitir que el usuario decida cómo resolverlo).

Sin embargo, si dentro de su paquete de prueba usa la notación de puntos en el paquete que está probando, ¡entonces se tratan como el mismo paquete y no hay dependencia circular!

Eli Davis
fuente