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

前書き

現在のプログラム以外でコードに追加機能が必要になる場合があります。 これらの場合、パッケージを使用してプログラムをより洗練させることができます。 パッケージは、ディスク上の単一のディレクトリ内のすべてのファイルを表します。 パッケージは、他の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を使用することもできます。