「。」とは (ドットまたはピリオド)Goインポートステートメントでは?


135

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"    
)

.(期間)の意味は何ですか?


22
注:簡単に検索できるように、質問にドットとピリオドを追加しました。
Jared Farrish 2011年

回答:


182

これにより、インポートされたパッケージの識別子を、修飾子なしでローカルファイルブロックで参照できます。

名前の代わりに明示的なピリオド(。)が表示される場合、パッケージのすべてのエクスポートされた識別子は現在のファイルのファイルブロックで宣言され、修飾子なしでアクセスできます。

関数Sinをエクスポートするパッケージ句package mathを含むパッケージをコンパイルし、コンパイルしたパッケージを「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 '06 / 06/26

いくつかのシナリオでは混乱するかもしれませんが、go-linqを使用することに我慢できませんでした。github.com/ahmetalpbalkan/go-linq
steviesama

ただし、エクスポートされていない関数(大文字以外の関数)にはアクセスできません。したがって、このインポート方法は本当に厄介です。
David天宇Wong

1
ドットインポートを使用してプログラムをコンパイルする場合と、ドットインポートを使用しない場合。コンパイルされたファイルのサイズに大きな違いがある理由はありますか?ドットインポートを使用すると、サイズが大きくなります。
majidarif '10 / 10/19

@majidarif:それは興味深い観察です:)問題を再現するコードを使用して、別の質問を投稿していただけませんか?(私はimport "fmt"vsを使用して単純なhello-worldプログラムをコンパイルして自分で試そうとしましたimport . "fmt"が、どちらの場合も同じサイズでした。)
Attilio

66

Pythonからのアナロジーは次のとおりです。

  • Go import "os"はPythonとほぼ同じですimport os
  • Go import . "os"はPythonとほぼ同じですfrom os import *

どちらの言語でも、後者を使用することは一般的に嫌われますが、使用することには十分な理由があります。


4

これはテストでのみ使用してください。

これはgolangのwikiのドキュメントです

mockgenなどを使用してモックコードを生成し、パッケージコードをインポートしてから、テストパッケージパッケージコードをインポートすると、循環依存関係が発生します(golangがユーザーが解決方法を決定できるようにすることを選択します)。

ただし、テストパッケージ内で、テストするパッケージにドット表記を使用すると、それらは同じパッケージとして扱われ、循環依存関係が発生することはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.