前書き
現在のプログラム以外でコードに追加機能が必要になる場合があります。 これらの場合、パッケージを使用してプログラムをより洗練させることができます。 パッケージは、ディスク上の単一のディレクトリ内のすべてのファイルを表します。 パッケージは、他のGoファイルまたはパッケージで参照できる関数、タイプ、およびインターフェースを定義できます。
このチュートリアルでは、パッケージのインストール、インポート、およびエイリアシングについて説明します。
標準ライブラリパッケージ
Goに同梱されている標準ライブラリは、一連のパッケージです。 これらのパッケージには、最新のソフトウェアを作成するための基本的な構成要素の多くが含まれています。 たとえば、fmt
パッケージには、文字列をフォーマットおよび印刷するための基本的な関数が含まれています。 net/http
パッケージには、開発者がWebサービスを作成したり、http
プロトコルを介してデータを送受信したりできるようにする関数が含まれています。
パッケージ内の関数を使用するには、import
ステートメントを使用してパッケージにアクセスする必要があります。 import
ステートメントは、パッケージの名前とともにimport
キーワードで構成されます。
例として、Goプログラムファイルrandom.go
で、math/rand
パッケージをインポートして、次の方法で乱数を生成できます。
random.go
import "math/rand"
パッケージをインポートすると、現在のプログラムで別の名前空間として利用できるようになります。 これは、package.function
のように、dot notationで関数を参照する必要があることを意味します。
実際には、math/rand
パッケージの関数は次の例のようになります。
-
ランダムな整数を返す関数を呼び出す
rand.Int()
。 -
0
から指定された数までのランダムな要素を返す関数を呼び出すrand.Intn()
。
for
ループを作成して、random.go
プログラム内でmath/rand
パッケージの関数を呼び出す方法を示しましょう。
random.go
package main
import "math/rand"
func main() {
for i := 0; i < 10; i++ {
println(rand.Intn(25))
}
}
このプログラムは、最初に3行目のmath/rand
パッケージをインポートし、次に10回実行されるfor
ループに移動します。 ループ内で、プログラムは0
から25
までの範囲内のランダムな整数を出力します。 整数25
は、パラメーターとしてrand.Intn()
に渡されます。
go run random.go
を使用してプログラムを実行すると、出力として10個のランダムな整数を受け取ります。 これらはランダムであるため、プログラムを実行するたびに異なる整数が得られる可能性があります。 出力は次のようになります。
Output6
12
22
9
6
18
0
15
6
0
整数が0未満または24を超えることはありません。
複数のパッケージをインポートする場合は、()
を使用してブロックを作成できます。 ブロックを使用することにより、すべての行でimport
キーワードを繰り返さないようにすることができます。 これにより、コードがよりきれいになります。
random.go
import (
"fmt"
"math/rand"
)
追加のパッケージを利用するために、出力をフォーマットし、ループ中に各乱数が生成された反復を出力できるようになりました。
random.go
package main
import (
"fmt"
"math/rand"
)
func main() {
for i := 0; i < 10; i++ {
fmt.Printf("%d) %d\n", i, rand.Intn(25))
}
}
これで、プログラムを実行すると、次のような出力が表示されます。
Output0) 6
1) 12
2) 22
3) 9
4) 6
5) 18
6) 0
7) 15
8) 6
9) 0
このセクションでは、パッケージをインポートし、それらを使用してより洗練されたプログラムを作成する方法を学びました。 これまでのところ、標準ライブラリのパッケージのみを使用しました。 次に、他の開発者が作成したパッケージをインストールして使用する方法を見てみましょう。
パッケージのインストール
標準ライブラリには多くの優れた便利なパッケージが付属していますが、それらは意図的にgeneral purposeになるように設計されており、本質的に特定のものではありません。 これにより、開発者は特定のニーズに合わせて、標準ライブラリの上に独自のパッケージを構築できます。
Goツールチェーンには、go get
コマンドが付属しています。 このコマンドを使用すると、サードパーティのパッケージをローカル開発環境にインストールして、プログラムで使用できます。
go get
を使用してサードパーティのパッケージをインストールする場合、パッケージが正規パスによって参照されるのが一般的です。 そのパスは、GitHubなどのコードリポジトリでホストされているパブリックプロジェクトへのパスにすることもできます。 そのため、flect
パッケージをインポートする場合は、完全な正規パスを使用します。
go get github.com/gobuffalo/flect
go get
ツールは、この場合はGitHubでパッケージを検索し、$GOPATH
にインストールします。
この例では、コードは次のディレクトリにインストールされます。
$GOPATH/src/github.com/gobuffalo/flect
パッケージは、バグに対処したり新しい機能を追加したりするために、元の作者によって頻繁に更新されています。 この場合、そのパッケージの最新バージョンを使用して、新機能または解決されたバグを活用することができます。 パッケージを更新するには、go get
コマンドで-u
フラグを使用できます。
go get -u github.com/gobuffalo/flect
このコマンドは、ローカルで見つからない場合、Goにパッケージをインストールさせます。 既にインストールされている場合、Goはパッケージを最新バージョンに更新しようとします。
go get
コマンドは、常に利用可能なパッケージの最新バージョンを取得します。 ただし、パッケージの以前のバージョンに対する更新は、使用しているものよりもまだ新しい可能性があり、プログラムで更新するのに役立ちます。 パッケージの特定のバージョンを取得するには、Go ModulesなどのPackage Managementツールを使用する必要があります。
Go 1.11の時点で、Goモジュールは、インポートするパッケージのバージョンを管理するために使用されます。 パッケージ管理のトピックはこの記事の範囲を超えていますが、on the Go Modules GitHub pageについて詳しく読むことができます。
インポートされたパッケージのエイリアス
使用しているサードパーティのパッケージと同じ名前のローカルパッケージが既にある場合は、パッケージ名を変更できます。 この場合、衝突を処理するには、インポートのエイリアスを作成するのが最善の方法です。 インポートされたパッケージの前にalias
の名前を付けることで、Go内のパッケージの名前とその機能を変更できます。
このステートメントの構成は次のようになります。
import another_name "package"
この例では、random.go
プログラムファイルのfmt
パッケージの名前を変更します。 省略形にするために、fmt
のパッケージ名をf
に変更します。 変更されたプログラムは次のようになります。
random.go
package main
import (
f "fmt"
"math/rand"
)
func main() {
for i := 0; i < 10; i++ {
f.Printf("%d) %d\n", i, rand.Intn(25))
}
}
プログラム内では、Printf
関数をfmt.Printf
ではなくf.Printf
と呼びます。
他の言語は、プログラムの後半で使いやすくするためにパッケージのエイリアスを好むが、Goはそうではない。 たとえば、fmt
パッケージをf
にエイリアスすると、style guideと一貫性がなくなります。
名前の衝突を避けるためにインポートの名前を変更するときは、最もローカルまたはプロジェクト固有のインポートの名前を変更することを目指してください。 たとえば、strings
という名前のlocalパッケージがあり、strings
という名前のsystemパッケージもインポートする必要がある場合は、システムよりもローカルパッケージの名前を変更することをお勧めします。パッケージ。 可能な限り、名前の衝突を完全に回避することが最善です。
このセクションでは、プログラム内の別のインポートと衝突しないようにインポートをエイリアスする方法を学びました。 プログラムの読みやすさと明確さは重要であるため、コードを読みやすくするため、または名前の衝突を避ける必要がある場合にのみエイリアスを使用する必要があります。
インポートのフォーマット
インポートをフォーマットすることにより、パッケージを特定の順序にソートして、コードの一貫性を高めることができます。 さらに、これにより、変更されるのがインポートの並べ替え順序のみである場合に、ランダムコミットが実行されなくなります。 インポートをフォーマットするとランダムなコミットが防止されるため、不必要なコードのチャーンや混乱するコードレビューが防止されます。
ほとんどのエディターは、インポートを自動的にフォーマットするか、goimports
を使用するようにエディターを構成できるようにします。 インポートの並べ替え順序を手動で維持しようとすると、面倒でエラーが発生しやすいため、エディターでgoimports
を使用することは標準的な方法と見なされます。 さらに、スタイルの変更が行われると、goimports
が更新され、それらのスタイルの変更が反映されます。 これにより、あなたとあなたのコードで作業するすべての人が、インポートブロックで一貫したスタイリングを持つことが保証されます。
以下に、フォーマット前のインポートブロックの例を示します。
import (
"fmt"
"os"
"github.com/digital/ocean/godo"
"github.com/sammy/foo"
"math/rand"
"github.com/sammy/bar"
)
goimport
ツールを実行すると(または、ツールがインストールされているほとんどのエディターで、ファイルを保存すると実行されます)、次の形式になります。
import (
"fmt"
"math/rand"
"os"
"github.com/sammy/foo"
"github.com/sammy/bar"
"github.com/digital/ocean/godo"
)
最初にすべての標準ライブラリパッケージをグループ化し、次にサードパーティパッケージを空白行とともにグループ化することに注意してください。 これにより、どのパッケージが使用されているかを読みやすく理解しやすくなります。
このセクションでは、goimports
を使用すると、すべてのインポートブロックが適切にフォーマットされ、同じファイルで作業する開発者間で不要なコードがチャーンするのを防ぐことができることを学びました。
結論
パッケージをインポートすると、Goに組み込まれていない関数を呼び出すことができます。 一部のパッケージはGoとともにインストールされる標準ライブラリの一部であり、一部はgo get
を介してインストールされます。
パッケージを利用することで、既存のコードを活用しているため、プログラムをより堅牢で強力にすることができます。 また、自分自身や他のプログラマーが将来のプログラムで使用するためにcreate our own packagesを使用することもできます。