まったりするmatayu

ツイートにゴミがついた感じのブログ

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の書き方を学ぶのに良いかも.