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

提供:Dev Guides
移動先:案内検索

序章

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

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

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

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

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

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

random.go

import "math/rand"

パッケージをインポートすると、現在のプログラムで別の名前空間として使用できるようになります。 これは、package.functionのように、ドット表記で関数を参照する必要があることを意味します。

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

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

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パッケージをインポートし、次にforループに移動します。このループは10回実行されます。 ループ内で、プログラムは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などのコードリポジトリでホストされているパブリックプロジェクトへのパスにすることもできます。 そのため、 flect パッケージをインポートする場合は、完全な正規パスを使用します。

go get github.com/gobuffalo/flect

go getツールは、この場合はGitHubでパッケージを検索し、 $GOPATHにインストールします。

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

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

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

go get -u github.com/gobuffalo/flect

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

go getコマンドは、常に利用可能なパッケージの最新バージョンを取得します。 ただし、以前のバージョンのパッケージには、使用しているものよりもまだ新しい更新がある可能性があり、プログラムで更新すると便利です。 パッケージの特定のバージョンを取得するには、 GoModulesなどのPackageManagementツールを使用する必要があります。

Go 1.11以降、Goモジュールは、インポートするパッケージのバージョンを管理するために使用されます。 パッケージ管理のトピックはこの記事の範囲を超えていますが、GoModulesGitHubページの詳細を読むことができます。

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

使用しているサードパーティパッケージと同じ名前のローカルパッケージがある場合は、パッケージ名を変更することをお勧めします。 これが発生した場合、インポートのエイリアスは衝突を処理するための最良の方法です。 インポートしたパッケージの前に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にすると、スタイルガイドと一致しなくなります。

名前の衝突を避けるためにインポートの名前を変更するときは、最もローカルまたはプロジェクト固有のインポートの名前を変更することを目指す必要があります。 たとえば、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を介してインストールされます。

パッケージを利用することで、既存のコードを活用することで、プログラムをより堅牢で強力なものにすることができます。 また、独自のパッケージを作成して、自分自身や他のプログラマーが将来のプログラムで使用できるようにすることもできます。