Что это '.'(точка или точка) в операторе импорта Go? - PullRequest
125 голосов
/ 25 июня 2011

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

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

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

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

Какое значение имеет . (период)?

Ответы [ 3 ]

167 голосов
/ 25 июня 2011

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

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

Предположим, что мы скомпилировали пакет, содержащий пакет 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

63 голосов
/ 26 июня 2011

Вот аналогия для тех, кто пришел с Python:

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

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

2 голосов
/ 02 августа 2018

Это должно использоваться только при тестировании.

Вот некоторая документация в вики Голанга

Если вы сгенерировали какой-то фиктивный код, например, с помощью mockgen, и он импортирует код вашего пакета, а затем ваш тестовый пакет также импортирует код вашего пакета, вы получаете циклическую зависимость (что-то, что golang решает позволить пользователь решает, как решить).

Однако, если внутри вашего пакета тестирования вы используете точечную нотацию в тестируемом пакете, то они обрабатываются как один и тот же пакет, и круговой зависимости не будет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...