序章

コードが現在のプログラム以外の追加機能を必要とする場合があります。 このような場合、パッケージを使用してプログラムをより洗練されたものにすることができます。 パッケージは、ディスク上の単一のディレクトリ内のすべてのファイルを表します。 パッケージは、他の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 の関数を呼び出す方法を示すループ math/rand 私たちのパッケージ内 random.go プログラム:

random.go
package main

import "math/rand"

func main() {
  for i := 0; i < 10; i++ {
    println(rand.Intn(25))
  }
}

このプログラムは最初に math/rand 3行目のパッケージに移動し、 for それが10回実行されるループ。 ループ内で、プログラムは次の範囲内のランダムな整数を出力します 0 まで 25. 整数 25 に渡されます rand.Intn() そのパラメータとして。

プログラムを実行すると go run random.go、出力として10個のランダムな整数を受け取ります。 これらはランダムであるため、プログラムを実行するたびに異なる整数を取得する可能性があります。 出力は次のようになります。

Output
6 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))
  }
}

これで、プログラムを実行すると、次のような出力が返されます。

Output
0) 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 パッケージをインポートする場合は、完全な正規パスを使用します。

  1. go get github.com/gobuffalo/flect

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

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

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

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

  1. go get -u github.com/gobuffalo/flect

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

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

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

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

使用しているサードパーティパッケージと同じ名前のローカルパッケージがある場合は、パッケージ名を変更することをお勧めします。 これが発生した場合、インポートのエイリアスは衝突を処理するための最良の方法です。 Go内でパッケージの名前とその機能を変更するには、 alias インポートされたパッケージの前の名前。

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

import another_name "package"

この例では、の名前を変更します fmt のパッケージ random.go プログラムファイル。 のパッケージ名を変更します fmtf 省略します。 変更したプログラムは次のようになります。

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 として機能する f.Printf それよりも fmt.Printf.

他の言語は、プログラムの後半で使いやすくするためにパッケージのエイリアシングを好みますが、Goはそうではありません。 たとえば、エイリアシング fmt パッケージに f スタイルガイドと一致しません。

名前の衝突を避けるためにインポートの名前を変更するときは、最もローカルまたはプロジェクト固有のインポートの名前を変更することを目指す必要があります。 たとえば、localパッケージが strings、また、systemパッケージをインポートする必要がありました。 strings、システムパッケージよりもローカルパッケージの名前を変更することをお勧めします。 可能な限り、名前の衝突を完全に回避するのが最善です。

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

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

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

ほとんどのエディターは、インポートを自動的にフォーマットするか、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.

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