Go言語のパッケージ(package)の基本的な構成を見ていこうと思います。
これまでは、package main の形での処理しかファイルを扱っていませんでした。また、それに関連するパッケージのimportしか扱いませんでした。
ここでは、簡単なパッケージを自分で作って、どういう形でパッケージを使うのかというところの基本的な形を見ていこうと思います。
packageを自作して利用
簡単なパッケージを自作することによって、Go言語の構成を見ていこうと思います。
これまで扱ったGoファイルは、Goをインストールした際に設定したsrcフォルダの中に任意のプロジェクトフォルダを作って、その中に作成した1つのGoファイルにコードを書いて処理していました。
ここでは新たにpkgProjectというプロジェクトフォルダを作って作業をしていこうと思います。フォルダを作成する位置は先ほども書いたようにsrcフォルダの中です。
以下のような構成のディレクトリとgoファイルを作ってここでは作業します。
プロジェクトの中にmain.goというファイルを作ります。このmainからプログラミングは実行されるという意味になります。同じ階層にmypkgというフォルだを作っています。
このmypkgフォルダの中にmycalc.goというファイルとunderpkgというフォルダを作成します。
このunderpkgというフォルダの中にgreeting.goというファイルを作っています。
まず、mycalc.goファルから見ていきましょう。
次のようなコードを作ってみました。
package mypkg
import "fmt"
func Rectangle(l int, m int) int {
return l * m
}
func Intro() {
fmt.Println("これはmypkgです。")
}
package名としてファイル格納しているフォルダのmypkgを指定しています。
矩形を計算する関数Rectangle()と文章を表示する関数Intro()を定義しています。簡単な関数なので問題ないと思います。
今度は、greeting.goファイルを作って行きます。
package underpkg
import "fmt"
func Hello() {
fmt.Println("Hello, my package!")
}
package名としてファイル格納しているフォルダのunderpkgを指定しています。このフォルダは、mypkgフォルダの中にあるフォルダです。
Hello()関数を定義して、文章を出力する処理を書いています。
こちらも特に問題ないと思います。
では、main()関数を書いて、これらのパッケージを呼び出して使うコードを書いてみます。
package main
import (
"fmt"
"pkgProject/mypkg"
"pkgProject/mypkg/underpkg"
)
func main() {
fmt.Println(mypkg.Rectangle(4, 5))
mypkg.Intro()
underpkg.Hello()
}
実行するファイルなので、package名をmainとしています。
パッケージのインポートは、これまでのfmtパッケージのようにインポートするわけではなく、自分で作ったパッケージなので、そのフォルダのパスまで指定してインポートしています。
main()関数の中で、パッケージを呼び出して処理してします。それぞれのパッケージ名に続けて、ドットで接続して関数を呼び出しているのがわかります。
実行すると次のようになります。
20
これはmypkgです。
Hello, my package!
それぞれのパッケージの処理が、実行されているのがわかります。
このような形でパッケージを作ってインポートして利用することになります。
package作成の注意点
以上の形でパッケージ作成を利用することができますが、特に難しいところは無かったとは思いますが、気をつけないといけないことは、パッケージ無いで定義する関数などの関数名を大文字で始めるということです。
上で定義したパッケージの関数は全て大文字で書きはじめていることに注意してください。
これを小文字にしてしまうと、他からパッケージを呼び出して使うことはできません。
試しにmypkgフォルダのmycalc.goのRectangle()をrectangle()に変えて、mein.goでmypkg.rectangle()で呼び出して実行してみると次のようなエラーになります。
# command-line-arguments
./main.go:10:14: cannot refer to unexported name mypkg.rectangle
./main.go:10:14: undefined: mypkg.rectangle
関数名だけでなく、構造体名や構造体のフィールド名など、他のファイルから呼び出す部分の頭文字を大文字で書く必要があります。
なお、パッケージフォルダの中のファイル名自体は、インポートには意識することはなく、パッケージ名だけが関係してくるということも頭に入れておくと迷わないです。
また、パッケージの中にパッケージフォルダを作ることもできます。
最後に
ここではGo言語のパッケージの使い方の基本について見てきました。
パッケージの自作には、パッケージのフォルダの名前をpackageに設定します。
パッケージに定義する関数などの頭文字は大文字で書き始める必要があります。小文字だと外のファイルから呼び出すことができず、エラーになります。
パッケージのインポートには、自作したパッケージは保存したディレクトリのパスまで含めてimportする必要があります。