Go言語 100Tips ありがちなミスを把握し、実装を最適化する
発売日: 2023/8/18
ISBN: 9784295017530
全文検索: 非対応
★★★★★
★★★★★
0件
-
-
-
-
※本書はEPUB(固定レイアウト型)で作成されております。検索機能や文字列のコピーがご利用できません。
Goプログラミングにありがちな間違いを網羅的に解説!
間違いに対処しておくことで、開発生産性とコード品質を高めよう。
本書では、Goアプリケーションによくある100の間違いを取り上げ、
その例を検証し、その背景にある事柄を掘り下げていきます。
さらに、間違いを回避するためのヒント、テクニックを紹介し、
実際の現場で間違いを回避できるようにします。
本書で取り上げる間違いは、バグ、不必要な複雑さ、可読性の低下、
最適ではない/慣用的ではないソフトウェア構成、APIの利便性の欠如、
最適化されていないコード、生産性の欠如です。
Go言語の文法のほか、エラー管理、並行処理、標準ライブラリ、テスト、最適化など
さまざまなカテゴリーにおける間違いを見ていきます。
【推薦の言葉】
Go開発者が製品環境でコードに触れる前に必ず読むべき本。
『Effective Java』に相当するGoの本です―Neeraj Shah, Nutanix
わかりやすく、効果的な例題。間違いがどのようになぜ起こるのかを理解することで、
手痛い間違いを避けられます―Giuseppe Maxia, VMware
【章構成】
第1章 Go言語―学ぶのは容易、習得は難しい
第2章 コードとプロジェクト構成
第3章 データ型
第4章 制御構造
第5章 文字列
第6章 関数とメソッド
第7章 エラー管理
第8章 並行処理:基本編
第9章 並行処理:実践編
第10章 標準ライブラリ
第11章 テスト
第12章 最適化
◎本書を読むにはGo言語の構文について理解している必要があります。
◎本書は『100 Go Mistakes and How to Avoid Them』の翻訳書です。
※この商品は固定レイアウトで作成されており、タブレットなど大きいディスプレイを備えた端末で読むことに適しています。また、文字列のハイライトや検索、辞書の参照、引用などの機能が使用できません。
購入前にお使いの端末で無料サンプルをお試しください。
目次プレビュー
- サンプルコード・正誤表・商標について
- The Land of Go Mistakes
- 献辞
-
1.2 単純であれば容易であるとは限らない/1.3 100個のGoの間違い
-
1.3.1 バグ
-
1.3.2 不必要な複雑さ/1.3.3 可読性の低下/1.3.4 最適ではない、または慣用的ではないソフトウェア構成
-
1.3.5 APIの利便性の欠如/1.3.6 最適化されていないコード/1.3.7 生産性の欠如
-
2.2 No.2:不必要にネストしたコード
-
2.3 No.3:init関数の誤用/2.3.1 init関数の概念
-
2.3.2 init関数を使うべき場合
-
2.4 No.4:ゲッターとセッターの多用
-
2.5 No.5:インタフェース汚染/2.5.1 インタフェースの概念
-
2.5.2 インタフェースを使う場合
-
2.5.3 インタフェース汚染
-
2.6 No.6:生産者側のインタフェース
-
2.7 No.7:インタフェースを返す
-
2.8 No.8:anyは何も伝えない
-
2.9 No.9:ジェネリクスをいつ使うべきかで混乱する/2.9.1 ジェネリクスの概念
-
2.9.2 一般的な用途と誤用
-
2.10 No.10:型埋め込みで起こり得る問題点を意識していない
-
2.11 No.11:関数オプションパターンを使わない
-
2.11.1 Config構造体
-
2.11.2 ビルダーパターン
-
2.11.3 関数オプションパターン
-
2.12 No.12:プロジェクトの誤った構成/2.12.1 プロジェクトの構造
-
2.12.2 パッケージ構成
-
2.13 No.13:ユーティリティパッケージの作成
-
2.14 No.14:パッケージ名の衝突を無視する
-
2.15 No.15:コードのドキュメントがない
-
2.16 No.16:リンターを使わない
-
3.2 No.18:整数のオーバーフローを無視する/3.2.1 整数に関する概念
-
3.2.2 1を加算したときに整数のオーバーフローを検出する
-
3.2.3 加算時の整数オーバーフローの検出/3.2.4 乗算時の整数オーバーフローの検出
-
3.3 No.19:浮動小数点を理解していない
-
3.4 No.20:スライスの長さと容量を理解していない
-
3.5 No.21:非効率なスライスの初期化
-
3.6 No.22:nilスライスと空スライスに混乱する
-
3.7 No.23:スライスが空か否かを適切に検査しない
-
3.8 No.24:スライスのコピーを正しく行わない
-
3.9 No.25:スライスへのappendによる予期しない副作用
-
3.10 No.26:スライスとメモリリーク/3.10.1 容量のリーク
-
3.10.2 スライスとポインタ
-
3.11 No.27:非効率なマップの初期化/3.11.1 マップの概念
-
3.11.2 初期化
-
3.12 No.28:マップとメモリリーク
-
3.13 No.29:値の比較の誤り
-
4.1.2 値のコピー
-
4.2 No.31:rangeループでの引数の評価方法を無視する
-
4.2.1 チャネル
-
4.2.2 配列
-
4.3 No.32:rangeループでポインタ要素を使う影響を無視する
-
4.4 No.33:マップの反復処理で誤った仮定をする/4.4.1 反復処理での順序
-
4.4.2 反復処理中のマップへの挿入
-
4.5 No.34:break文の仕組みを無視する
-
4.6 No.35:ループ内でdeferを使う
-
6.2 No.43:名前付き結果パラメータを使わない
-
6.3 No.44:名前付き結果パラメータによる意図しない副作用
-
6.4 No.45:nilレシーバを返す
-
6.5 No.46:ファイル名を関数の入力として使う
-
6.6 No.47:deferの引数やレシーバの評価方法を無視している/6.6.1 引数の評価
-
6.6.2 ポインタレシーバと値レシーバ
-
8.2 No.56:並行処理は常に高速であると考える/8.2.1 Goのスケジューリング
-
8.2.2 並列マージソート
-
8.3 No.57:チャネルとミューテックスの使い分けに悩む
-
8.4 No.58:競合問題を理解していない/8.4.1 データ競合と競合状態
-
8.4.2 Goメモリモデル
-
8.5 No.59:作業負荷の種類による並行処理の影響を理解していない
-
8.6 No.60:Goのコンテキストを誤解する/8.6.1 デッドライン
-
8.6.2 キャンセルシグナル
-
8.6.3 コンテキスト値
-
8.6.4 コンテキストのキャンセルを捕捉する
-
9.2 No.62:ゴルーチンを停止するタイミングをわからずに起動する
-
9.3 No.63:ゴルーチンとループ変数の扱いに注意しない
-
9.4 No.64:selectとチャネルを使って、決定的な動作を期待する
-
9.5 No.65:通知チャネルを使わない
-
9.6 No.66:nilチャネルを使っていない
-
9.7 No.67:チャネルの大きさに迷う
-
9.8 No.68:文字列のフォーマットで起こり得る副作用を忘れる/9.8.1 etcdのデータ競合
-
9.8.2 デッドロック
-
9.9 No.69:appendでデータ競合を生み出す
-
9.10 No.70:スライスとマップで誤ったミューテックスを使う
-
9.11 No.71:sync.WaitGroupの誤用
-
9.12 No.72:sync.Condの存在を忘れている
-
9.13 No.73:errgroupを使わない
-
9.14 No.74:syncパッケージの型をコピーする
-
10.2 No.76:time.Afterとメモリリーク
-
10.3 No.77:よくあるJSON処理の間違い/10.3.1 型埋め込みによる予期しない動作
-
10.3.2 JSONとモノトニッククロック
-
10.3.3 anyのマップ
-
10.4 No.78:よくあるSQLの間違い/10.4.1 sql.Openは必ずしもデータベースへのコネクションを確立しないことを忘れる
-
10.4.2 コネクションプールについて忘れている
-
10.4.3 プリペアドステートメントを使わない
-
10.4.4 null値の誤った扱い
-
10.4.5 行の反復処理時のエラーに対処しない
-
10.5 No.79:一時的な資源をクローズしない/10.5.1 HTTPボディ
-
10.5.2 sql.Rows
-
10.5.3 os.File
-
10.6 No.80:HTTPリクエストに応答した後にreturn文を忘れる
-
10.7 No.81:デフォルトのHTTPクライアントとサーバーを使う/10.7.1 HTTPクライアント
-
10.7.2 HTTPサーバー
-
11.1.1 ビルドタグ
-
11.1.2 環境変数
-
11.1.3 ショートモード
-
11.2 No.83:-raceフラグを有効にしない
-
11.3 No.84:テスト実行モードを使わない/11.3.1 -parallelフラグ
-
11.3.2 -shuffleフラグ
-
11.4 No.85:テーブル駆動テストを使わない
-
11.5 No.86:単体テストでスリープする
-
11.6 No.87:time APIを効率よく扱わない
-
11.7 No.88:テスト用ユーティリティパッケージを使っていない/11.7.1 httptestパッケージ
-
11.7.2 iotestパッケージ
-
11.8 No.89:不正確なベンチマークを書く
-
11.8.1 タイマーをリセットしたり一時停止したりしない
-
11.8.2 マイクロベンチマークについて間違った仮定をする
-
11.8.3 コンパイラの最適化に注意を払わない
-
11.8.4 観察者効果にだまされる
-
11.9 No.90:Goテストの機能をすべて使いこなしていない/11.9.1 コードカバレッジ
-
11.9.2 別パッケージからのテスト
-
11.9.3 ユーティリティ関数
-
11.9.4 事前準備と事後処理
-
12.1.1 CPUアーキテクチャ
-
12.1.2 キャッシュライン
-
12.1.3 構造体のスライスとスライスの構造体
-
12.1.4 予測可能性
-
12.1.5 キャッシュ配置ポリシー
-
12.2 No.92:偽共有につながる並行コードを書く
-
12.3 No.93:命令レベルの並列処理を考慮しない
-
12.4 No.94:データアラインメントを意識していない
-
12.5 No.95:スタックとヒープを理解していない/12.5.1 スタックとヒープ
-
12.5.2 エスケープ分析
-
12.6 No.96:割り当てを減らす方法を知らない
-
12.6.1 APIの変更/12.6.2 コンパイラの最適化
-
12.6.3 sync.Pool
-
12.7 No.97:インライン展開に頼らない
-
12.8 No.98:Goの診断ツールを使っていない/12.8.1 プロファイリング
-
12.8.2 実行トレーサー
-
12.9 No.99:GCの仕組みを理解していない/12.9.1 ガベージコレクタの概念
-
12.9.2 GCの例
-
12.10 No.100:DockerやKubernetesでGoを実行することによる影響を理解していない