Upgrade to Pro — share decks privately, control downloads, hide ads and more …

io/fsパッケージを読む - tenntenn.go#2

io/fsパッケージを読む - tenntenn.go#2

この資料はtenntenn.go#2で登壇を行った際に用いた資料です。

■ tenntenn.goとは
tenntenn.goはtenntennが主催し、そしてすべてのセッションがtenntennによる登壇のGoに関する勉強会です。

イベントページ:https://tenntenn.connpass.com/event/238886/
アンケート:https://tenn.in/tenngo2-survey
ハッシュタグ:#tenngo
再放送:https://connpass.com/event/239636
資料(Googleスライド):https://tenn.in/iofs-reading
動画:https://tenn.in/iofs-reading-video

■ 登壇者&主催者

・名前:tenntenn / 上田拓也
・HP:https://tenntenn.dev
・Twitter:https://twitter.com/tenntenn

メルカリ/メルペイ所属。バックエンドエンジニアとして日々Goを書いている。Google Developer Expert (Go)。一般社団法人Gophers Japan代表。Go Conference主催者。大学時代にGoに出会い、それ以来のめり込む。人類をGopherにしたいと考え、Goの普及に取り組んでいる。複数社でGoに関する技術アドバイザーをしている。マスコットのGopherの絵を描くのも好き。

■ お仕事の依頼について

副業にて技術顧問やアドバイザーなどを行っています。過去の実績や問い合わせフォームは以下のURLからご確認ください。
https://tenntenn.dev/ja/job/

#golang #tenntenn #tenngo #Go言語

tenntenn - Takuya Ueda

February 15, 2022
Tweet

More Decks by tenntenn - Takuya Ueda

Other Decks in Technology

Transcript

  1. 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

    View full-size slide

  2. 上田拓也
    Go ビギナーズ

    Go Conference

    @tenntenn
    tenntenn.dev
    Google Developer Expert (Go)
    一般社団法人 Gophers Japan 代表理事
    Experts Team

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. io/fsパッケージとは?

    View full-size slide

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

    View full-size slide

  12. 抽象化されて得るメリット
    ■ 例: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を使う処理 */
    }

    View full-size slide

  13. 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"))

    View full-size slide

  14. リーディングタイム!!

    View full-size slide

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

    View full-size slide

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

    View full-size slide