前回は、ローカルの別パッケージをimportして、その関数を呼び出すようにしてみました。
Go言語はパッケージ周りに色々と制約が他にもあるので、このあたりをもう少し色々と見てみようかなと思います。
◆ 同一階層に複数パッケージ定義は不可
Javaとかは1ファイル1クラス以上の定義で、インポートするのはクラス単位のイメージでした。
ただ、Go言語だと、クラスではなくモジュール、インポート対象はパッケージ単位のようです。
そのため、同一ディレクトリ階層で複数のパッケージを定義するとダメなようです。
試しに
のようにしてみると…
つまり「test1\main階層に main2 と main という2つのパッケージがある」というエラーとなってしまいます。
そのため、同じ階層に配置するGoファイル(モジュール)のパッケージ名は統一する必要があります。
これは、ディレクトリ名と合わせることを推奨しているということでしょうね。
◆ 上位階層のパッケージをimport
今までの改装を1つ変更し、
main\main.go から out\outmessage.go を参照したい場合、パッケージの位置関係が今までのままだとうまく表現できません。
Go言語では、相対パスのパッケージimportは推奨されていないようです。
そのため、test1階層 (mainやoutのディレクトリ階層) でパッケージを定義する必要があります。
まずは test1階層で go mod init test1 を実行して、パッケージ定義を更新。
[go.mod] (test1階層)
階層構造とパッケージの関係はこうなるはずです。
という関係になります。
[out\outmessage.go] (追加)
のように定義。
これを main\main.go から参照するには、以下のようにすればよさそうです。
(もともとの printパッケージも相対的に変わっているので…そこも修正)
[main\main.go (修正後)]
これで実行すれば、無事に実行できていることが分かりました。
理解さえしてしまえば、それほど難しい話ではないですね。