プログラミング

【メモ】みんなのGo言語を読んでみて

みんなのGo言語を読んだ内容で、メモ的な感じでまとめていきたいと思います。
まだ読んでいる途中なので、適宜追記していきます。

読むべきドキュメント

Go言語を学び始めたら、↑のドキュメントは一通り読んでみる

Goの定石

  • エラーチェックは必ず
    if err != nil {
    // エラーの場合の処理
    }
  • 正規表現はあまり使わない
    正規表現はパフォーマンスが悪いので、Stringsパッケージを使うのが定石
  • GOのコードを読んで、ベストプラクティスを学ぶのが良い
    $ ghq get golang/go

GOのメリット

  • プログラムを実行するのに必要な環境を入れる必要がない
  • バイナリを配布するだけで良い

マルチプラットフォームで動かすために注意しないといけないこと

  • windowsでも動かす事ができるようにpath/filepathパッケージを使用する
  • TUIアプリケーション作る場合は、termboxを使うことでwindowsでもエスケープシーケンスの表示が可能
  • Runtime.GOOSを使うことで、OS別に処理を書くことが可能
  • シングルバイナリにする
  • 画像ファイル等のアセットがある場合でもシングルバイナリとしてデプロイを簡略化できるようにする
    • statik, Packr
      • 静的なファイルをバイナリに埋め込む事ができる

アプリケーション作成のテクニック

  • バージョン番号をバイナリに埋め込む
    • 本番に反映しても、バイナリなのでソースコードが見れずどのバージョンなのかが分からないので、flagパッケージを利用してバージョンを埋め込むようにしている
      • go build時に-ldflagsを指定することで、ビルド時にバージョンを埋め込む事が可能
  • バファリングを行う
    • バファリングとは、データを一時的に蓄えて、一度に処理を行うこと
    • golangでは自動でバファリングは行われないので、標準出力やファイルへの出力をする場合は、fmtパッケージを利用するかm,Io.WriterインターフェースへのWrite()を行う
  • タイムアウト
    • contextパッケージに、タイムアウト等を設定する
    • コンテキストは親子関係を持つことができるから、祖先のコンテキストがキャンセルやタイムアウトとなった時に、その状態を子にも伝える事ができる
    • 子のコンテキストがタイムアウトになった場合は、親には伝わらず子だけが完了となる
    • アプリケーション全体の停止は親のコンテキストに対してキャンセルを行う
  •  goroutineの停止方法
    • チャネルを使用する方法と、contextを使用する方法の2つがある
      • contextだと、タイムアウトを設定する事ができる
      • defer cancel()で、メモリリークしないように、必ずどこかでキャンセル処理を行う必要がある

CLIツールについて

  • goをCLIツールに使う利点
    • 配布のしやすさ
      • コンパイル後のバイナリを配布すれば良い
    • マルチプラットフォーム
    • パフォーマンス
  • go getを前提としたディレクトリ構成で作る
    • $GOPATH/src/github.com/xxx/xxxx
  • バイナリをメインの成果物
    • ルートディレクトリに、メインとなるバイナリコードを置く(package main)
  • ライブラリをメインの成果物
    • cmd/xxxディレクトリ配下にバイナリコード(package main)を入れる

黒魔術

  • 動的な型の判別
    • 型アサーション(interface{})を使って、動的に型を判別することができる
      • ただ、map型の判別は出来ない
        • keyとvalueの型も定義が必要
      • そういう場合にreflectパッケージを用いる
    • reflectパッケージは、型がわからなくても動的に取得することが可能
    • reflectはパフォーマンスの劣化につながるので、必要な時のみ使う

テスト

  • 個別のテスト
    • go -run TestXXX
  • テストのキャッシュクリア
    • Go clean -testcache
  • Table Driven Tests
    • テーブルにテストを列挙して、イテレーターでテストを回していく
    • メリットは新しいテストを追加しやすい
    • エラーメッセージは分かりやすく書く
      • 「Aが帰ってきたけど、実はBが欲しかった」のような感じで
  • reflect.DeepEqual
    • mapやstructを比較するテストが書ける
    • 再帰的に値を読み込んで比較している
  • Race Detector
    • goroutineで並列処理ができるので、同じ変数に並列でアクセスして、競合してしまうことがある
    • Race Detectorを使うことで、競合するところを見つけ出すことができる
    • ただ、メモリ使用量が5~10倍になるので、本番では使わずにテストで使うようにするべき

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

  1. 未分類

    Hello world!
  2. プログラミング

    【メモ】みんなのGo言語を読んでみて
PAGE TOP