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