ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Go言語】Go言語でパッケージを使う

 他の言語ではライブラリなどをインストールした後にincludeやimportを書けばすんなり使えるようになりますが、Go言語ではその辺りが少し面倒になっています。

 なので今回はGo言語でパッケージを使うimportの書き方についての備忘録になります。

 細かい情報は参考資料に挙げているページ様を参照してください。


 では、始めます。


1:標準機能のパッケージ
 まずはGo言語自体に含まれている標準パッケージをimportする場合です。

 これは以下の記事にもすでに出てきていますが「fmt」や「encoding/json」がそれになります。

 この場合は特に意識することなく、以下のようにimport文を書けばimportされて機能を使えるようになります。

import (
	"encoding/json"
	"fmt"
)

 余談ですが、VSCode拡張機能としてGo言語を入れている場合は、プログラム中に「fmt.Println("hoge")」などと記述してファイルを保存すると自動的にimport文を修正してくれます。


2:自作パッケージ
 次は自作パッケージの場合を説明します。自作パッケージとは「自分で作成したパッケージ」、つまりは「自分が作成した別ファイル」です。
 複雑な処理だと別ファイルに分ける必要が出てくるので、割と使うかと思います。

 Go言語で標準機能のパッケージ以外を使う場合は、依存関係をgo.modというファイルによって管理しています。そしてこのgo.modファイルは基本的には「関係するディレクトリ毎に作成」しておく必要があります。
 なのでまずはこの管理用のファイルを作成します。

 ディレクトリに移動して以下のコマンドを実行します。

go mod init [パッケージ名]

 これを実行すると実行した階層に「go.mod」というファイルが作成されます。
 またパッケージ名のところは一番上の階層を元にスラッシュ(/)区切りで追加していくと命名が楽になるかと思います。

 と、ここまで文字だけで説明してもよくわからないと思うので、実際に以下のような構成の場合を考えてみます。

/hoge
│ hoge_main.go
│
└─common
    common.go
    common2.go

 構成として「hogeディレクトリをmainとしてcommonディレクトリ内に他の機能を記述している」形になっています。
 なので「hoge」というパッケージを作成するという前提で進めます。

 この構成の場合、まずhogeディレクトリまで移動して以下のコマンドを実行します。

go mod init hoge

 すると同階層に以下のファイルが作成されます。goの後にある数字はgoのバージョンになります。

hogeディレクトリにできたgo.mod

module hoge

go 1.22.2

 次にhoge/commonディレクトリに移動して以下のコマンドを実行してgo.modファイルを作成します。

go mod init hoge/common

 このコマンドではcommonディレクトリ内に以下のファイルが作成されます。

hoge/commonディレクトリにできたgo.mod

module hoge/common

go 1.22.2

 各コマンドを実行した結果、構成は以下のようになっています。

/hoge
│ hoge_main.gogo.mod
│
└─common
    common.go
    common2.go
    go.mod

 このままではimportができないので各go.modファイルを修正していきます。

 と言っても今回はhoge_main.goからcommonを呼び出したいのでhogeディレクトリ内のgo.modファイルのみを修正します。

 以下のようにreplaceの一行を追記して上書き保存します。

hogeディレクトリのgo.mod

module hoge/common

go 1.22.2

replace common => ./common // 追記

 これで相対パスが設定できましたが、まだgo側で認識できていないので以下のコマンドでimportできるようにします。

 hogeディレクトリで以下のコマンドを実行します。

go mod tidy

 すると以下のように「require」の行が自動的に追加されます。

hogeディレクトリのgo.mod

module hoge/common

go 1.22.2

replace common => ./common // 追記

require common v0.0.0-00010101000000-000000000000

 これでようやくhoge_main.goからcommonパッケージをimportして使えるようになりました。

 あとはhoge_main.goで以下のように記述すれば使えるようになります。

import common

common.[関数名]

 面倒でわかりにくいかと思いますが、実際に自分でgo mod initやgo mod tidyコマンドを実行して確かめるのが一番理解しやすいと思います。

 今回と同じ構成のものをアップロードしておいたので、必要な方は使ってみてください。


3:外部パッケージ
 次は外部パッケージです。外部パッケージとは要は「個別にinstallしないと使えないパッケージ」のことです。

 インストール方法はそのパッケージのREADMEなどを参照することになりますが、コマンドを実行する必要があります。

 今回はハッシュ値を作成するパッケージである「bcrypt」をインストールからimportまでやってみます。

 まず前提としてgo.modファイルが作られている必要があります。

 go.modがあるディレクトリに移動して以下のコマンドを実行します。

go get [パッケージ名]

 今回の例だとbcryptを使いたいので、以下のコマンドを実行します。

go get golang.org/x/crypto/bcrypt

 実行するとgo.modファイルに以下が追記されます。

require golang.org/x/crypto v0.23.0 // indirect

 go.sumというファイルも作成されますが、go.sumは人の手で触ることは基本的にないので「外部パッケージを指定するための何かのファイル」という程度の認識で良いかと思います。

 これでこの階層のgoファイルで以下のように記述することでbcryptが使えるようになります。

import (
	"golang.org/x/crypto/bcrypt"
)

// 暗号(Hash)化した文字列を返す関数
func PasswordEncrypt(password string) (string, error) {
	hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
	return string(hash), err
}

// 暗号(Hash)と入力された平パスワードの比較する関数
func CompareHashAndPassword(hash string, password string) error {
	return bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
}


 以上がGo言語でパッケージを使う方法になります。

 簡単にimportさせてくれない作りなので戸惑うかと思いますが、基本的には以下の手順でやれば良いかと思います。

  1. go mod initでgo.modファイルを作る
  2. go.modファイルを編集する、go getコマンドでパッケージを入れる
  3. go mod tidyで適応させる

 自分もまだ全然慣れておらず、importできない場合はとりあえずgo.modファイルを見直してgo mod tidyコマンドを打ってみるということをやっていたりします。
 早くこの辺りを理解して一発で環境が整えられるようにしたいです。
 
・参考資料