Что это '.' (точка или период) в операторе импорта Go?

В учебнике Go и большей части кода Go, на который я смотрел, пакеты импортируются следующим образом:

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

Но в http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go пакет gocheck импортируется с помощью . (period):

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

Каково значение . (period)?

Ответ 1

Он позволяет идентифицировать идентификаторы в импортированном пакете в локальном файловом блоке без квалификатора.

Если вместо имени указывается явный период (.), все экспортированные с помощью пакета идентификаторы будут объявлены в текущем файловом файле и могут быть доступны без квалификатора.

Предположим, что мы скомпилировали пакет, содержащий пакетное предложение package math, которое экспортирует функцию Sin, и установил скомпилированный пакет в файл, идентифицированный "lib/math". В этой таблице показано, как можно получить доступ к Sin в файлах, которые импортируют пакет после различных типов декларации импорта.

Import declaration          Local name of Sin

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

Ссылка: http://golang.org/doc/go_spec.html#Import_declarations

Ответ 2

Здесь аналогия для тех, что исходят от Python:

  • Go import "os" примерно эквивалентен Python import os
  • Go import . "os" примерно эквивалентен Python from os import *

В обоих языках использование последнего обычно неодобрительно, но для этого могут быть веские причины.