web-dev-qa-db-ja.com

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

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

.(期間)の重要性は何ですか?

126
Eric Seidel

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

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

関数Sinをエクスポートするpackage句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

170
tvanfosson

Pythonから来た人の例えは次のとおりです。

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

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

64
Evan Shaw

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

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

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

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

3
Eli Davis