Що означає "." (крапка або крапка) у заяві про імпорт Go - робити?


135

У підручнику Go і більшості коду Go, який я переглянув, пакети імпортуються так:

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

Але в http://bazaar.launchpad.net/~niemeyer/lpad/trunk/view/head:/session_test.go пакет імпортування імпортується з .(періодом):

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

Яке значення має період .(період)?


22
Зауважте, я додав до запитання крапку та крапку, щоб полегшити пошук.
Джаред Фарріш

Відповіді:


182

Це дозволяє посилатися на ідентифікатори в імпортованому пакеті в локальному файловому блоці без класифікатора.

Якщо замість імені з’являється явний період (.), Всі експортовані ідентифікатори пакета будуть оголошені у блоці файлів поточного файлу та можна отримати доступ без кваліфікатора.

Припустимо, ми склали пакет, що містить статтю математичного пакета, який експортує функцію 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


29
Слід зазначити, що команда Go не рекомендує використовувати імпорт крапок. Це може викликати певну поведінку в певних випадках, а може бути не в мові нескінченно.
jimt

Це може бути заплутано в деяких сценаріях, але я не витримав використання go-linq. github.com/ahmetalpbalkan/go-linq
steviesama

Зауважте, що ви все ще не можете отримати доступ до неекспортованих функцій (не великі функції). Тож такий спосіб імпорту справді відстійний.
Девід 天宇 Вонг

1
Під час компіляції програми з використанням імпорту точок проти не імпортування точок. Чи є причина, чому існує велика різниця, якщо компільований розмір файлу? Використання компіляцій точок імпорту до більшого розміру.
майдариф

@majidarif: Це цікаве спостереження :) Чи не могли б ви залишити окреме запитання щодо цього коду, який відтворює проблему? (Я намагався зробити це сам, складаючи просту програму привітного світу з import "fmt"vs import . "fmt", але в обох випадках він був однакового розміру для мене.)
Attilio

66

Ось аналогія для тих, хто походить з Python:

  • Go's import "os"приблизно еквівалентний Python'simport os
  • Go's import . "os"приблизно еквівалентний Python'sfrom os import *

В обох мовах використання останньої нахмуриться, але для цього можуть бути вагомі причини.


4

Це слід використовувати лише при тестуванні.

Ось деяка документація у вікі Голангу

Якщо ви створили якийсь макет-код, наприклад, з mockgen, і він імпортує код вашого пакета, а потім ваш тестовий пакет також імпортує код вашого пакета, ви отримуєте кругову залежність (Щось голанг вирішує, щоб користувач міг вирішити, як вирішити).

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.