Book description
イディオマティックなGo言語の解説書。構文がシンプル、静的型付け、タイプセーフでメモリセーフ、バグが入り込みにくい、並行処理が得意、実行速度が速い……これらの魅力的な特徴を生かすためには、Go言語らしい書き方を可能にする「イディオム」を学ぶ必要があります。Go言語のイディオムをマスターすれば、効率的で読みやすいコードを書けます。本書では、Go言語の基本機能を明快かつ簡潔に説明しつつ、イディオマティックなGoコードの書き方やGoプロジェクトの設計方法を解説します。読者はベテランのGo開発者のように考える術を学べます。
Table of contents
- 大扉
- 原書大扉
- クレジット
- 賞賛の声
- 訳者まえがき
- まえがき
- 1章 Go環境のセットアップ
- 1.1 開発ツールのインストール
- 1.2 ディレクトリの指定
- 1.3 goコマンド
- 1.3.1 go run
- 1.3.2 go build
- 1.3.3 go mod
- 1.3.4 go install
- 1.3.5 コードのフォーマット
- セミコロン挿入規則
- 1.4 lintとvet
- 1.5 ツールの選択
- 1.5.1 Visual Studio Code
- 1.5.2 GoLand
- 1.5.3 Go Playground
- 1.6 Makefile
- 1.7 開発環境やバイナリファイルの更新
- 1.8 まとめ
- 2章 基本型と宣言
- 2.1 基本型
- 2.1.1 ゼロ値
- 2.1.2 リテラル
- 2.1.2.1 整数リテラル
- 2.1.2.2 浮動小数点数リテラル
- 2.1.2.3 runeリテラル
- 2.1.2.4 文字列リテラル
- 2.1.2.5 リテラルと型
- 2.1.3 論理型 bool
- 2.1.4 数値型
- 2.1.4.1 整数型
- 2.1.4.2 特別な整数型
- 2.1.4.3 整数型の選択
- 2.1.4.4 整数関連の演算子
- 2.1.4.5 浮動小数点数型
- IEEE 754
- 2.1.4.6 複素数型
- 2.1.5 文字列型とrune型
- 2.1.6 明示的型変換
- 2.2 変数の宣言
- 2.3 定数
- 2.4 型付きの定数と型のない定数
- 2.5 未使用変数
- 未使用の定数
- 2.6 変数および定数の名前
- 2.7 まとめ
- 3章 合成型
- 3.1 配列
- 3.2 スライス
- 3.2.1 len
- 3.2.2 append
- 3.2.3 スライスのキャパシティ
- Goのランタイム
- 3.2.4 make
- 3.2.5 スライスの生成方法の選択
- 3.2.6 スライスのスライス
- 3.2.6.1 スライスの記憶領域の共有
- 3.2.7 配列からスライスへの変換
- 3.2.8 メモリを共有しないスライスのコピー
- 3.3 文字列、rune、バイト
- UTF-8
- 3.4 マップ
- ハッシュマップ
- 3.4.1 マップの読み書き
- 3.4.2 カンマokイディオム
- 3.4.3 マップからの削除
- 3.4.4 マップとセット
- 3.5 構造体
- 3.5.1 無名構造体
- 3.5.2 構造体の比較と変換
- 3.6 まとめ
- 4章 ブロック、シャドーイング、制御構造
- 4.1 ブロック
- 4.1.1 変数のシャドーイング
- 4.1.2 シャドーイングされた変数の検知
- ユニバースブロック
- 4.2 if
- 4.3 for
- 4.3.1 標準形式のfor文
- 4.3.2 条件のみのfor文
- 4.3.3 無限ループ
- 4.3.4 breakとcontinue
- 4.3.5 for-rangeループ
- 4.3.5.1 マップのイテレーション
- 4.3.5.2 文字列を対象にしたイテレーション
- 4.3.5.3 for-rangeの値はコピー
- 4.3.6 ラベル
- 4.3.7 for文の選択
- 4.4 switch
- 4.4.1 switchの基本構文
- 4.4.2 ブランクswitch
- 4.4.3 break
- 4.5 ifかswitchか
- 4.6 goto
- 4.7 まとめ
- 5章 関数
- 5.1 関数の宣言と呼び出し
- 5.1.1 名前付き引数とオプション引数
- 5.1.2 可変長引数とスライス
- 5.1.3 複数の戻り値
- 5.1.4 戻る複数の値のPythonとの違い
- 5.1.5 戻り値の無視
- 5.1.6 名前付き戻り値
- 5.1.7 ブランクreturn
- 5.2 関数は値
- 5.2.1 関数型の宣言
- 5.2.2 無名関数
- 5.3 クロージャ
- 5.3.1 関数引数
- 5.3.2 関数から関数を返す
- 5.4 defer
- 5.5 Goは値渡し
- 5.6 まとめ
- 6章 ポインタ
- 6.1 ポインタ入門
- 6.2 ポインタを恐れる必要はない
- 6.3 ポインタはミュータブル(変更可能)の印
- 6.4 ポインタは最後の手段
- 6.5 ポインタ渡しのパフォーマンス
- 6.6 「ゼロ値」と「値なし」
- 6.7 マップとスライスの違い
- 6.8 バッファとして使うスライス
- 6.9 ガベージコレクタの負荷軽減策
- 6.10 まとめ
- 7章 型、メソッド、インタフェース
- 7.1 Goの型
- 7.1.1 抽象型と具象型
- 7.1.2 基底型
- 7.1.3 型の定義
- 7.2 メソッド
- 7.2.1 ポインタ型レシーバと値型レシーバ
- 7.2.2 nilへの対応
- 7.2.3 メソッドは関数
- 7.2.4 関数とメソッドの使い分け
- 7.2.5 型宣言と継承の違い
- 7.2.6 型は実行可能なドキュメント
- 7.2.7 iotaと列挙型
- 7.3 埋め込みによる合成
- 7.4 埋め込みと継承の違い
- 7.5 インタフェースとは
- インタフェースは型安全なダックタイピング
- 7.6 埋め込みとインタフェース
- 7.7 インタフェースを受け取り構造体を返す
- 7.8 インタフェースとnil
- 7.9 空インタフェース
- 7.10 型アサーションと型switch
- 7.10.1 型アサーション
- 7.10.2 型switch
- 7.11 型アサーションと型switchの使用は控えめに
- 7.12 関数型とインタフェース
- 7.13 暗黙のインタフェースによる依存性注入
- 7.14 依存性注入コードの生成
- 7.15 Goはさほどオブジェクト指向ではない
- 7.16 まとめ
- 8章 エラー処理
- 8.1 エラー処理の基本
- 8.2 単純なエラーの際の文字列の利用
- 8.3 センチネルエラー
- センチネルエラーのための定数の利用
- 8.4 エラーと値
- 8.5 エラーのラップ
- 8.6 IsとAs
- 8.7 deferを使ったエラーのラップ
- 8.8 パニックとリカバー
- 8.9 エラー時のスタックトレースの取得
- 8.10 まとめ
- 9章 モジュールとパッケージ
- 9.1 リポジトリ、モジュール、パッケージ
- 9.2 モジュールとgo.modファイル
- 9.3 パッケージの構築
- 9.3.1 インポートとエクスポート
- 9.3.2 パッケージの作成とアクセス
- 9.3.3 パッケージの命名法
- 9.3.4 モジュールの構成方法
- 9.3.5 パッケージ名のオーバーライド
- 9.3.6 パッケージのコメントとgodoc
- 9.3.7 内部パッケージ
- 9.3.8 init関数
- 9.3.9 循環参照
- 9.3.10 名称変更や再構成
- 9.4 モジュール関連の操作
- 9.4.1 サードパーティーのコードのインポート
- 9.4.2 モジュールのバージョン
- セマンティックバージョニング
- 9.4.3 ミニマルバージョン選択
- 9.4.4 互換性をもつバージョンへのアップデート
- 9.4.5 非互換のバージョンへのアップデート
- 9.4.6 ベンダリング
- 9.4.7 pkg.go.devサイト
- 9.5 モジュールの公開
- 9.6 モジュールのバージョンの決定
- 9.7 モジュールプロキシサーバ
- 9.7.1 プロキシサーバの指定
- 9.7.2 プライベートなリポジトリ
- 9.8 まとめ
- 10章 並行処理
- 10.1 並行性をいつ利用するべきか
- 10.2 ゴルーチン
- 10.3 チャネル
- 10.3.1 読み込み、書き込み、バッファリング
- 10.3.2 for-rangeとチャネル
- 10.3.3 チャネルのクローズ
- 10.3.4 チャネルの動作
- 10.4 select
- 10.5 並行処理のベストプラクティスとパターン
- 10.5.1 APIに並行性は含めない
- 10.5.2 ゴルーチンとforループ
- 10.5.3 ゴルーチンの終了チェック
- 10.5.4 doneチャネルパターン
- 10.5.5 キャンセレーション関数を用いたゴルーチンの終了
- 10.5.6 いつバッファ付きのチャネルを使うべきか
- 10.5.7 バックプレッシャ
- 10.5.8 selectにおけるcaseの無効化
- 10.5.9 タイムアウト
- 10.5.10 WaitGroupの利用
- golang.org/xとerrgroup
- 10.5.11 コードを一度だけ実行
- 10.5.12 並行処理ツールの協調
- 10.6 チャネルの代わりにミューテックスを使うべきとき
- sync.Map
- 10.7 sync/atomic
- 10.8 まとめ
- 11章 標準ライブラリ
- 11.1 入出力
- 11.2 time
- 11.2.1 時間
- 11.2.2 時刻
- 11.2.3 モノトニックタイム
- 11.2.4 タイマーとタイムアウト
- 11.3 encoding/json
- 11.3.1 構造体タグを使ったメタデータの付加
- 11.3.2 アンマーシャリングとマーシャリング
- 11.3.3 JSONのリーダーとライター
- 11.3.4 JSONストリーミングのエンコードとデコード
- 11.3.5 JSON解析のカスタマイズ
- 11.4 net/http
- 11.4.1 クライアント
- 11.4.2 サーバ
- 11.4.2.1 ミドルウェア
- 11.4.2.2 サーバ強化のためのイディオム的なサードパーティーモジュールの追加
- 11.5 まとめ
- 12章 コンテキスト
- 12.1 コンテキストとは
- 12.2 キャンセレーション
- 12.3 タイマー
- 12.4 独自コードにおけるキャンセレーションの処理
- 12.5 コンテキストによる値の伝搬
- 12.6 まとめ
- 13章 テスト
- 13.1 テストの基礎
- 13.1.1 テスト失敗のレポート
- 13.1.2 設定の適用と解除
- 13.1.3 テスト用サンプルデータの保存
- 13.1.4 テスト結果のキャッシング
- 13.1.5 公開APIのテスト
- 13.1.6 go-cmpによるテスト結果の比較
- 13.2 テーブルテスト
- 13.3 コードカバレッジのチェック
- 13.4 ベンチマーク
- Goコードのプロファイリング
- 13.5 スタブ
- モックとスタブ
- 13.6 httptest
- 13.7 統合テストとビルドタグ
- フラグ-shortの使用
- 13.8 並行実行に関する問題とレースチェッカー
- 13.9 まとめ
- 14章 リフレクション、unsafe、cgo
- 14.1 リフレクション
- 14.1.1 型(type)、型情報(kind)、値(value)
- 14.1.1.1 型(type)と型情報(kind)
- 14.1.1.2 値(value)
- 14.1.2 新しい値の生成
- 14.1.3 インタフェースの値のnilチェック
- 14.1.4 データのマーシャリングのためのリフレクション
- 14.1.5 リフレクションで作った関数による繰り返し処理の自動化
- 14.1.6 構造体とリフレクション
- 14.1.7 リフレクションとメソッド
- 14.1.8 リフレクションを利用するべきとき
- 14.2 unsafe
- 14.2.1 unsafeを使ったバイナリデータの変換
- 14.2.2 unsafeな文字列とスライス
- 14.2.3 unsafe関連ツール
- 14.3 cgo
- 14.4 まとめ
- 15章 ジェネリクス
- 15.1 ジェネリクスによる繰り返しの削減と型安全性の向上
- 15.2 Go言語のジェネリクスの概要
- 15.3 ジェネリック関数によるアルゴリズムの抽象化
- 15.3.1 ジェネリクスとインタフェース
- 15.4 型タームを使った演算子の指定
- 15.4.1 型推論とジェネリクス
- 15.4.2 型要素による定数の制約
- 15.4.3 ジェネリック関数とジェネリックなデータ構造の利用
- 15.5 今後追加される可能性のある機能
- 15.6 イディオム的Goとジェネリクス
- 15.7 タグ付き共用体の可能性
- 15.8 まとめ
- 付録A Go言語のまとめ
- A.1 ほかの言語で(あまり)見られない点
- A.2 型とゼロ値
- A.2.1 基本型(組み込み型)
- A.2.2 合成型(複合データ型、コンテナ型)、その他
- A.3 変数と定数の宣言
- A.3.1 基本型の変数の宣言
- A.3.2 配列とスライスの宣言
- A.3.3 スライスへの要素の追加
- A.3.4 サブスライス(スライスの要素の削除)
- A.3.5 マップの宣言とリテラル
- A.3.6 makeを使ったスライスやマップの生成
- A.3.7 定数の宣言
- A.4 構造体の宣言とリテラル
- A.5 型のエイリアス
- A.6 iota
- A.7 制御構造
- A.7.1 ifとforの基本形
- A.7.2 for-rangeの例
- A.7.3 switch
- A.8 演算子
- A.9 関数
- A.10 メソッド
- A.11 継承
- A.12 インタフェース
- A.13 ゴルーチン
- A.13.1 チャネルからの読み込みのパターン
- A.13.1.1 変数への代入
- A.13.1.2 無視する
- A.13.1.3 select文のcaseでの代入
- A.13.1.4 for-rangeループ
- A.14 Goの「イディオム」
- A.14.1 イディオム的なもの
- A.14.2 「イディオム的」でない例
- A.14.3 その他、Goの「哲学」が感じられる選択
- A.14.4 備忘録
- 付録B 実例で学ぶGo言語入門
- B.1 予備知識
- B.1.1 Go言語のコードの留意点
- B.2 fmtパッケージの動詞(verb)
- B.2.1 例題ディレクトリの構成
- B.2.2 プログラムの実行
- B.2.3 実行結果
- B.3 基本構文と標準入出力
- B.3.1 例外処理
- B.3.2 関数とループ
- B.3.3 switch文
- B.3.4 日本語の識別子
- B.4 コマンド行計算機——コマンド行引数、文字列の置換と正規表現、外部コマンド
- B.5 ファイルの入出力
- B.5.1 ファイルの内容を一度に読み込み
- B.5.2 ファイルを1行ずつ処理
- B.5.3 練習問題
- B.6 ゴルーチン、チャネル、WaitGroup
- B.6.1 チャネルを使った単純な例
- B.6.2 ウェブサイトのチェック——WaitGroup版
- B.6.3 ウェブサイトのチェック——チャネル版
- B.7 まとめ
- 著者紹介
- 奥付
Product information
- Title: 初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド
- Author(s):
- Release date: September 2022
- Publisher(s): O'Reilly Japan, Inc.
- ISBN: 9784814400041
You might also like
book
大規模データ管理 ―エンタープライズアーキテクチャのベストプラクティス
データ管理と統合が急速に進化する中、複雑で緊密に結合したアーキテクチャから、現代のビジネスに対応できる、より柔軟なデータアーキテクチャへの移行が求められます。 本書は、変化が激しい時代でも長期的に持続可能な方法で大規模なデータ管理を行い、さまざまなユースケースに対応できる統合アーキテクチャを紹介します。この統合アーキテクチャを構成する、膨大なデータ利用に向けた「読み出し専用データストアアーキテクチャ」、リアルタイムなアプリケーションのための「APIアーキテクチャ」、大容量のスループットを実現する「ストリーミングアーキテクチャ」を詳述します。また技術開発、法規制、プライバシーに関する懸念など、データ管理全体を説明し、データガバナンスとセキュリティ、マスターデータ管理、セルフサービスとデータマーケットプレイス、メタデータの重要性について解説します。 企業のデータ戦略にかかわる本書は、アーキテクトはもちろん、経営者、ガバナンスチーム、データ分析・エンジニアリングチーム必携の一冊です。
book
データベースリライアビリティエンジニアリング ―回復力のあるデータベースシステムの設計と運用
テクノロジーの進化に合わせて、データベースもまた進化しています。従来のパフォーマンス、スケーラビリティが重要なことはもちろん、今日ではセキュリティ、インフラのコード化、CI/CD、クラウド活用といったタスクにも取り組んでいかなければなりません。 データベースの本質は、長期的に安定していること。つまりリライアビリティ(信頼性)です。時代とともにアーキテクチャやツールが変わってもこの原則は変わりません。本書はデータベースのリライアビリティを実現するための考え方を「データベースリライアビリティエンジニアリング」と定義して、その具体的な手法を紹介します。サービスのリライアビリティに関わるすべてのエンジニア必読の一冊です。
book
SQLではじめるデータ分析 ―クエリで行う前処理、時系列解析、コホート分析、テキスト分析、異常検知
クラウドの普及とともに、SQLの利用範囲は拡大し、データサイエンティストもデータベースを直接扱う機会が増えています。本書は、データ分析に関わるSQLのテクニックを学び、分析プロセスにおいてSQLを最大限に活用するためのものです。時系列解析などでは、SQLが日付・時刻の比較や処理に長けており、威力を発揮できる最たるものです。本書ではデータの前処理から始め、時系列解析、コホート分析、テキスト分析、異常検知など、SQLの操作を通じて高度なテクニックまで学ぶことができる構成になっています。サンプルコードはGitHubからダウンロード可能で、実際に手を動かしながら学ぶことができます。
book
リーンエンタープライズ ―イノベーションを実現する創発的な組織づくり
新規事業を生み出し、顧客にすばやく価値を届けるには、それを支援する体制が必要です。本書は、あらゆるムダを省き、継続的に仮説検証を繰り返しながら、プロダクトやサービスを構築する「リーンスタートアップ」の手法を既存の企業に適用するための方法を説明します。市場環境や顧客ニーズの変化に対応し、イノベーションを加速させ、組織文化、ガバナンス、財務管理を最適化し続けるハイパフォーマンス組織になるための原則とパターンを、さまざまな成功企業のケーススタディとともに詳述します。