サーチ…
パッケージ化の初期化
パッケージには、mainの前に一度だけ実行されるinitメソッドがあります。
package usefull
func init() {
// init code
}
そこから何も参照せずにパッケージの初期化を実行したいだけなら、次のインポート式を使用してください。
import _ "usefull"
パッケージの依存関係の管理
Go依存関係をダウンロードする一般的な方法は、パッケージをglobal / shared $GOPATH/srcディレクトリに保存するgo get <package>コマンドを使用するgo get <package>です。これは、各パッケージの単一のバージョンが、それを依存関係として含む各プロジェクトにリンクされることを意味します。これは、新しい開発者があなたのプロジェクトをデプロイするときに、各依存関係の最新バージョンをgo getすることを意味します。
しかし、プロジェクトのすべての依存関係をvendor/ディレクトリにアタッチすることで、ビルド環境を一貫性のあるものに保つことができます。プロジェクトのリポジトリとともにコミットされた依存関係を維持することで、プロジェクトごとの依存性のバージョニングを行い、ビルドに一貫した環境を提供できます。
プロジェクトの構造は次のようになります。
$GOPATH/src/
├── github.com/username/project/
| ├── main.go
| ├── vendor/
| | ├── github.com/pkg/errors
| | ├── github.com/gorilla/mux
別のパッケージとフォルダ名を使用する
フォルダ名以外のパッケージ名を使用するのはまったく問題ありません。これを行うと、ディレクトリ構造に基づいてパッケージをインポートする必要がありますが、インポート後にpackage節で使用した名前で参照する必要があります。
たとえば、 $GOPATH/src/mypckというフォルダがあり、そこにa.goというファイルがあるとします。
package apple
const Pi = 3.14
このパッケージを使用する:
package main
import (
"mypck"
"fmt"
)
func main() {
fmt.Println(apple.Pi)
}
これが機能しても、パッケージ名をフォルダ名から逸脱する正当な理由があるはずです(または誤解や混乱の原因になることがあります)。
これはどういう意味ですか?
シンプル。パッケージ名はGo idetifierです:
identifier = letter { letter | unicode_digit } .
ユニコード文字を識別子に使用できるようにします。たとえば、 αβはGoの有効な識別子です。フォルダ名とファイル名は、Goではなくオペレーティングシステムによって処理され、異なるファイルシステムには異なる制限があります。実際には、すべての有効なGo識別子をフォルダ名として使用できないファイルシステムが数多く存在するため、言語仕様で許されるもの以外のパッケージに名前を付けることはできません。
パッケージを含むフォルダとは異なるパッケージ名を使用するオプションがあるため、基本的なオペレーティングシステムやファイルシステムに関係なく、パッケージの言語仕様に実際に名前を付けることができます。
パッケージのインポート
次の文を使用して単一のパッケージをインポートできます。
import "path/to/package"
複数のインポートをグループ化する:
import (
"path/to/package1"
"path/to/package2"
)
これにより、 .goファイルの$GOPATH内の対応するimportパスが検索され、 packagename.AnyExportedName介してエクスポートされた名前にアクセスできます。
./パッケージの前に置くことで、現在のフォルダの中のローカルパッケージにアクセスすることもできます。このような構造のプロジェクトでは:
project
├── src
│ ├── package1
│ │ └── file1.go
│ └── package2
│ └── file2.go
└── main.go
file1.goとfile2.goコードをインポートするためにmain.goでこれを呼び出すことができます:
import (
"./src/package1"
"./src/package2"
)
パッケージ名は異なるライブラリで衝突する可能性があるので、あるパッケージを新しい名前にエイリアスすることができます。 import-statementの先頭に、使用する名前を付けることで、これを行うことができます。
import (
"fmt" //fmt from the standardlibrary
tfmt "some/thirdparty/fmt" //fmt from some other library
)
これにより、 fmt.*を使用して元のfmtパッケージにアクセスし、 tfmt.*を使用して後者のfmtパッケージにアクセスすることができます。
また、パッケージを独自のネームスペースにインポートして、パッケージなしでエクスポートした名前を参照することもできpackage.接頭辞は単一のドットを別名として使用します。
import (
. "fmt"
)
上記の例では、 fmtをグローバル名前空間にインポートし、たとえばPrintf直接呼び出すことができます: Playground
パッケージをインポートしたがエクスポートされた名前を使用しない場合、Goコンパイラはエラーメッセージを出力します。これを回避するには、エイリアスをアンダースコアに設定します。
import (
_ "fmt"
)
これは、このパッケージに直接アクセスするのではなく、実行するためのinit関数が必要な場合に便利です。
注意:
パッケージ名はフォルダ構造に基づいているため、フォルダ名とインポート参照(大文字と小文字の区別を含む)の変更により、Linux&OS-Xではコンパイル時エラー "大文字小文字を区別しないインポート衝突"が発生します。修正してください(エラーメッセージは単なる死体にとってはちょっと分かりませんが、その反対を伝えようとします - 大文字と小文字の区別のために比較が失敗しました)。
ex: "path / to / Package1"と "path / to / package1"
実例: https : //github.com/akamai-open/AkamaiOPEN-edgegrid-golang/issues/2