Slide 1

Slide 1 text

The Go gopher was designed by Renée French. The gopher stickers was made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license. io/fsパッケージを 読む 2022年02月15日(火) 資料:https://tenn.in/iofs-reading

Slide 2

Slide 2 text

上田拓也 Go ビギナーズ
 Go Conference
 @tenntenn tenntenn.dev Google Developer Expert (Go) 一般社団法人 Gophers Japan 代表理事 Experts Team

Slide 3

Slide 3 text

コードリーディングの方法

Slide 4

Slide 4 text

コードリーディング ■ 標準パッケージを読む ● 古くはGo研でも行われていた ● https://devblog.thebase.in/entry/go-code-reading ● https://future-architect.github.io/articles/20200310/ ■ 準備の少ないコードリーディング会 ● お題(読むパッケージ)を決める ● 選んだお題に期待することを当日話す ● 時間を決めてみんなでそれぞれ読む(20分とか) ● 読みながらSlackのスレッドにメモをしていく ● 残りの時間で気になったところを議論する ● 自分が気づけなかった点を知ることができる

Slide 5

Slide 5 text

コードが読みやすいツール ■ Google Open Sourceを使う ● https://cs.opensource.google/go ● 標準パッケージや準標準パッケージのソースコードが見れる ● pkg.go.devから辿れる ● 識別子の参照や変更履歴などが追える

Slide 6

Slide 6 text

blameして経緯を知る ■ なぜその実装になっているのか知ろう ● blameからGerritをたどりissue番号を特定する blameパネルが開く Gerritが開く

Slide 7

Slide 7 text

バージョンごとの実装が見れる ■ ブランチやタグを切り替える ● どのバージョンでその実装になったか調べる ● masterと最新リリース版の違いを調べる

Slide 8

Slide 8 text

アウトラインからアクセス ■ アウトラインパネルを使う ● フィルターなどもかけられる ● クリックすると定義位置までジャンプする

Slide 9

Slide 9 text

検索を使いこなす ■ 充実した検索機能 ● https://developers.google.com/code-search/reference ● class:で型名で検索できる ● func:で関数名で検索できる ● 検索範囲(プロジェクトやディレクトリ)を指定できる

Slide 10

Slide 10 text

io/fsパッケージとは?

Slide 11

Slide 11 text

ファイルシステムの抽象化 ■ Go1.16からio/fsパッケージとして導入された ● fs.FSインタフェースによって表現される ● ファイルを開くという最低限の機能を定義している type FS interface { Open(name string) (File, error) } 宣伝:エキスパートたちの Go言語でも書いてます!

Slide 12

Slide 12 text

抽象化されて得るメリット ■ 例:ZIPファイル ● ZIPファイルをファイルシステムとして扱う ● *zip.Reader型がOpenメソッドを実装 ● template.ParseFS関数など引数に渡せる func main() { r, err := zip.OpenReader("templates.zip") if err != nil { /* エラー処理 */ } defer r.Close() tmpl, err := template.ParseFS(r, "*.html") if err != nil { /* エラー処理 */ } /* tmplを使う処理 */ }

Slide 13

Slide 13 text

embedパッケージ ■ io/fsパッケージと同様にGo1.16で入った ● ファイルやディレクトリを埋め込むことができる ○ go-bindataやstatikなどと同じようなことができる ○ go toolに統合されているためgo generate不要 ● embed.FS型によってファイルシステムとして埋め込める ○ fs.FSインタフェースを実装 // templateディレクトリ以下をバイナリに埋め込む //go:embed template/* var tmplFS embed.FS // 埋め込まれたtemplateディレクトリをファイルシステムとして扱う var tmpl = template.Must(template.ParseFS(tmplFS, "*.html"))

Slide 14

Slide 14 text

リーディングタイム!!

Slide 15

Slide 15 text

io/fsパッケージを読もう ■ 普段何気なく使っている機能の裏側を覗こう ● https://cs.opensource.google/go/go/+/master:src/io/fs ● 型エイリアスってなんだっけ? ● fsパッケージにはどんなインタフェースがあるの? ● テストで循環参照さけるには?

Slide 16

Slide 16 text

まとめ ■ Goの標準パッケージはお宝 ● Goで書かれているの読めるぞ! ● pkg.go.devから辿って行ける ● blameして過去の経緯を知ろう ■ コードリーディング会は楽しい ● 自分だけでは気づかなかった点が知れる ● 一人では諦めてしまう低レイヤーな実装も頑張れる ● 議論の中から新しいアイデアや知見が見つかる