Goのパッケージ構成で 試行錯誤してみた話 Go conference 2015 Summer
Goのパッケージ構成で試行錯誤してみた話
Go conference 2015 Summer
自己紹介
@fkm / 深見
モケラボ株式会社
代表取締役(最近作った)Androidアプリを受託で作ったり
Goでサーバーサイド書いたり
Gocon 2015 SpringでGoにハマる
作ったもの
OpenInvoiceのバックエンド部分
パッケージ
● フォルダ=パッケージ● フォルダ名がパッケージ名● import時に別名をつけることができる
○ 名前がぶつかってもあんまり困らない○ とはいえ面倒
で
なんでパッケージ
分けるんだっけ?
公開ライブラリ
githubなどで公開されているものをそのまま指定できる
例)import ( "github.com/gorilla/mux")
package private
● 同じパッケージ内のみアクセスできる● Goでは小文字ではじまる名前がこれ● 外部には見せたくないけど共通の処理
● 往々にしてこういう関数ほどテストを書きたくなる
Goで何つくる?
● ライブラリ● ツール● Webサーバー
githubで公開するとき
● リポジトリ名がパッケージ名になる○ "github.com/gorilla/mux"
● ライブラリが複数パッケージで構成される場合は?○ なるべく分けずに1つに詰め込む?○ 依存するパッケージも1つずつリポジトリ作る?
こんな時は
読め!
github.com/gorilla/mux/mux.go
1つずつ
リポジトリ
作るの。。。?
Dockerでは?
docker/api/server/server_linux.go
github.com/docker/docker/daemon
ライブラリを作る時
複数のパッケージを
1つのリポジトリにいれても
大丈夫
GoでWebサーバー
REST層
Service層
Model層
よく言われること
実装と
インターフェースは
分けよう
こうやってみた
MySQLで動くようにしてよー
SQLiteで動くようにしてよー
どこに追加するんだ。。。?
これはどうだ?
ん?
Javaってこうやってたような?
試行錯誤のまとめ
● ライブラリは、1リポジトリに複数パッケージいれても大丈夫○ ライブラリ内での参照も可能
● アプリでのパッケージ分けは、他の言語と同様、基本に忠実に。
もうちょっとだけ
パッケージの話
internal
● Go 1.4で追加● service/impl/internal ● importできるのはツリー上にいるパッケージの
み● github上のパッケージでは、使えない。。
パッケージ名判定
http://www.pkgname.com/
● パッケージ名がGoらしいかどうかを判定してくれるツール○ go-libのような-をつけるのはダメぽん などを指摘○ githubで公開する前に確認しよう
な、なくなってる。。。。
パッケージ名判定
かろうじてソースはあった
https://github.com/aybabtme/pkgname
近日中に弊社サイトで動くようにしてみます