golangのパッケージ分け
main package直書き開発をしていたから,そろそろしっかりパッケージ分けをしたいと思う.
packageを分ける際の決まり事
golangはpackageを分ける際に,例えばdatabase packageだったら
ファイルの頭で package database
と宣言すればいい...だけではない!
packageごとにディレクトリも分けなければならない.
例えば次のような感じ.
ChatApp ├── chat │ └── melody.go ├── database │ └── db.go ├── main.go ├── oauth │ └── oauth.go └── router └── router.go
chatディレクトリの中のmelody.goはpackage chat で,databaseディレクトリの中のdb.goはpackage databaseといった具合である.
この時,ディレクトリ名とpackage名は一致させる必要がある.
関数のスコープ
引っかかったのは関数のスコープ.
golangは他のpackageから関数を参照する時,関数名の先頭が大文字のものでないといけないようだ.
database.sqlConnect()
のようにpackage databaseのsqlConnect()関数を呼び出そうとしたが,
"sqlConnect not exported by package database"というコンパイラエラーが出てしまい呼び出せなかった.
関数名の先頭を大文字にしてdatabase.SqlConnect()
として呼び出すことでエラーが消えた.
ちなみにpackage外から参照したいものの名前の先頭を大文字にするというのは,
関数名だけでなく,変数名や構造体名にも適用される.
関数をpackageに分類するための基準
たくさんのmainに直書きされた関数たち.
これらをどういった基準でどのpackageに分けていくのか.
そもそも,どのようなpackageを作れば良いのか.
その辺りが"何となく"でしかわからない.
そのうちわかるようになるか.
追記.
使用する外部packageがlocal package 同士で重複しないようにする.
という自分なりのpackageの分け方を思いついた.
golintの警告を見て清書
golintがコメントの書き方とかパッケージ名の決め方をレクチャーしてくれる感じだった.
素直に従ってぽちぽち直していった.
golintはgolangの書き方を学ぶのに良いかも.