Goでのパッケージのインポート

前書き

現在のプログラム以外でコードに追加機能が必要になる場合があります。 これらの場合、パッケージを使用してプログラムをより洗練させることができます。 パッケージは、ディスク上の単一のディレクトリ内のすべてのファイルを表します。 パッケージは、他のGoファイルまたはパッケージで参照できる関数、タイプ、およびインターフェースを定義できます。

このチュートリアルでは、パッケージのインストール、インポート、およびエイリアシングについて説明します。

標準ライブラリパッケージ

Goに同梱されている標準ライブラリは、一連のパッケージです。 これらのパッケージには、最新のソフトウェアを作成するための基本的な構成要素の多くが含まれています。 たとえば、https://golang.org/pkg/fmt [+ fmt +]パッケージには、文字列をフォーマットおよび印刷するための基本的な機能が含まれています。 https://golang.org/pkg/net/http/ [+ net / http +]パッケージには、開発者がWebサービスを作成したり、 `+ http +`プロトコルでデータを送信および取得したりできる機能が含まれています。

パッケージ内の関数を利用するには、 + import +`ステートメントでパッケージにアクセスする必要があります。 `+ import`ステートメントは、パッケージの名前とともに + import`キーワードで構成されます。

例として、Goプログラムファイル `+ random.go `で、 ` math / rand +`パッケージをインポートして、この方法で乱数を生成できます。

random.go

import "math/rand"

パッケージをインポートすると、現在のプログラムで別の名前空間として利用できるようになります。 つまり、 `。`のように、_dot表記法で関数を参照する必要があります。

実際には、 `+ math / rand +`パッケージの関数は次の例のようになります。

  • 関数を呼び出してランダムな整数を返す + rand.Int()+

  • `+ rand.Intn()`は、関数を呼び出して、指定された数値までの ` 0 +`からランダムな要素を返します。

+ random.go +`プログラム内で `+ math / rand`パッケージの関数を呼び出す方法を示すために、 + for`ループを作成しましょう。

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

このセクションでは、パッケージをインポートし、それらを使用してより洗練されたプログラムを作成する方法を学びました。 これまでのところ、標準ライブラリのパッケージのみを使用しました。 次に、他の開発者が作成したパッケージをインストールして使用する方法を見てみましょう。

パッケージのインストール

標準ライブラリには多くの便利で便利なパッケージが同梱されていますが、それらは「一般的な目的」であり、本質的に特定のものではないように意図的に設計されています。 これにより、開発者は特定のニーズに合わせて、標準ライブラリの上に独自のパッケージを構築できます。

Goツールチェーンには、 `+ go get +`コマンドが付属しています。 このコマンドを使用すると、サードパーティのパッケージをローカル開発環境にインストールして、プログラムで使用できます。

+ go get +`を使用してサードパーティのパッケージをインストールする場合、一般的なパスでパッケージが参照されるのが一般的です。 そのパスは、GitHubなどのコードリポジトリでホストされているパブリックプロジェクトへのパスにすることもできます。 そのため、https://github.com/gobuffalo/flect [+ flect +`]パッケージをインポートする場合は、完全な正規パスを使用します。

go get github.com/gobuffalo/flect

+ go get +`ツールは、この場合はGitHubでパッケージを見つけ、https://www.digitalocean.com/community/tutorials/understanding-the-gopath [+ $ GOPATH +`]にインストールします。

この例では、コードは次のディレクトリにインストールされます。

$GOPATH/src/github.com/gobuffalo/flect

パッケージは、バグに対処したり新しい機能を追加したりするために、元の作者によって頻繁に更新されています。 この場合、そのパッケージの最新バージョンを使用して、新機能または解決されたバグを活用することができます。 パッケージを更新するには、 `+ go get `コマンドで ` -u +`フラグを使用できます。

go get -u github.com/gobuffalo/flect

このコマンドは、ローカルで見つからない場合、Goにパッケージをインストールさせます。 既にインストールされている場合、Goはパッケージを最新バージョンに更新しようとします。

`+ go get +`コマンドは常に利用可能なパッケージの最新バージョンを取得します。 ただし、パッケージの以前のバージョンに対する更新は、使用しているものよりもまだ新しい可能性があり、プログラムで更新するのに役立ちます。 パッケージの特定のバージョンを取得するには、https://github.com/golang/go/wiki/Modules [Go Modules]などの* Package Management *ツールを使用する必要があります。

Go 1.11の時点で、Goモジュールは、インポートするパッケージのバージョンを管理するために使用されます。 パッケージ管理のトピックはこの記事の範囲外ですが、https://github.com/golang/go/wiki/Modules [Go Modules GitHubページ]で詳細を読むことができます。

インポートされたパッケージのエイリアス

使用しているサードパーティのパッケージと同じ名前のローカルパッケージが既にある場合は、パッケージ名を変更できます。 この場合、衝突を処理するには、インポートのエイリアスを作成するのが最善の方法です。 インポートされたパッケージの前に `+ alias +`の名前を置くことで、Go内でパッケージの名前と機能を変更できます。

このステートメントの構築は次のようになります。

import  ""

この例では、 `+ random.go `プログラムファイルの ` fmt `パッケージの名前を変更します。 パッケージ名を短縮するために、 ` fmt `のパッケージ名を ` f +`に変更します。 変更されたプログラムは次のようになります。

random.go

package main

import (

 "math/rand"
)

func main() {
 for i := 0; i < 10; i++ {
   ("%d) %d\n", i, rand.Intn(25))
 }
}

プログラム内で、 `+ Printf `関数を ` fmt.Printf `ではなく ` f.Printf +`と呼びます。

他の言語は、プログラムの後半で使いやすくするためにパッケージのエイリアスを好むが、Goはそうではない。 たとえば、 `+ fmt `パッケージを ` f +`にエイリアスすることは、https://github.com/golang/go/wiki/CodeReviewComments#import-dot [style guide]と一致しません。

名前の衝突を避けるためにインポートの名前を変更するときは、最もローカルまたはプロジェクト固有のインポートの名前を変更することを目指してください。 たとえば、 `+ strings `という_local_パッケージがあり、 ` strings +`という_system_パッケージもインポートする必要がある場合、システムパッケージよりもローカルパッケージの名前を変更する方が便利です。 可能な限り、名前の衝突を完全に回避することが最善です。

このセクションでは、プログラム内の別のインポートと衝突しないようにインポートをエイリアスする方法を学びました。 プログラムの読みやすさと明確さは重要であるため、コードを読みやすくするため、または名前の衝突を避ける必要がある場合にのみエイリアスを使用する必要があります。

インポートのフォーマット

インポートをフォーマットすることにより、パッケージを特定の順序にソートして、コードの一貫性を高めることができます。 さらに、これにより、変更されるのがインポートの並べ替え順序のみである場合に、ランダムコミットが実行されなくなります。 インポートをフォーマットするとランダムなコミットが防止されるため、これにより不必要なコードのチャーンや混乱するコードレビューが防止されます。

ほとんどのエディターはインポートを自動的にフォーマットするか、https://godoc.org/golang.org/x/tools/cmd/goimports [+ 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 +`を使用してインストールします。

パッケージを利用することで、既存のコードを活用するため、プログラムをより堅牢で強力にすることができます。 また、https://www.digitalocean.com/community/tutorials/how-to-write-packages-in-go [独自のパッケージを作成]を使用して、自分や他のプログラマが将来のプログラムで使用することもできます。