前回課題

  • Read.me
    • go get するように使い方をかく
  • 構造体の場合は、レシーバーは基本的にポインタにするのが良い
    • interface が出てきたときに当たりにくい
    • 毎回コピーが
  • mainパッケージ以外は外に出ないようにする
  • ファイルのクローズ忘れ
  • 必ずNew~関数で初期化する必要はない
  • package名と関数名が被らないようにすると良い
    • converter.new 関数など
    • converter.newConverter はあまり良くない

講義内容・ポイント

  • map
    • キーを複数使いたい時は構造体とする
    • ゼロ値が大事 ワードカウント
    // 削除されていることを確認
    n, ok = m["z"] // ゼロ値とfalseを返す
    println(n, ok)
  • コンポジット型を要素とする

    • struct の中に struct -> JSON化するときに良い
  • 型エイリアス

    • 主にリファクタリングに使う
    • 呼び方を変えたい、という意味合いで使われる
    • go1.9 からできた net context の話
    • ビルドのときに、エイリアス
    • あまり使わない。ライブラリの回収などで、古いパッケージの移行時に役立つ。
  • 関数

    • 型は後ろにかく。Cとは異なる
      • => Goは、型はどんな時でも後ろに書く
    • error を _ で省略すると、レビューでギッタギタにされる
    • 戻り値にも名前をつけられる return で返される
    • 値の入れ替えができる
      • x, y = y, x
    • ポインタ型は、その実態のメソッドを使用できる
  • パッケージ

    • ライブラリ
      • main関数のないGoプログラム
    • パッケージ変数の使用は最低限にしておく
    • ユニバーススコープ
      • main関数の main などは、ユニバーススコープである。上書き可能。
    • init関数

      • 特別な場合でない限りは使用しない。
      • 自動生成の時などは便利で使用されることがある。 k8sのコードなど。
    • goget が便利で、Goが流行った理由とも言える

    • C言語や以前のVerでは、Makefile を使用していた。

    • modules (vgoと開発段階では呼ばれていた。)

      • 使用するべき
      • ベンダリングという物を以前を使用していた、必要なくなった
      • goinstall(後のgo get) Makefile より利便性が向上した
      • gopkg.in go get で解決できなかったバージョンの調整を正してくれる

      • ベンダリング go modulesをオンにしなければ、まだ有効

        • gopath より有効
        • スナップショットを保持することで、ビルドの再現性を担保できる 配布時に便利
      • glideがよく使われていた

      • depやっていき宣言

      • その半年後なぜかすぐに vgo が作られた

        • moduleの概念導入
          • バージョン漬けを行う単位 
          • go.mod を使用
          • semver セマンティックバージョニング
            • semverで自分のライブラリを管理しよう
        • Minimal Version Selection

宿題

- 1. io.Readerとio.writeの重要性を調査
- 2. テストか書いてみる テストヘルパー
- インターフェース、抽象化のところを読む