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
AI技術を活かすためのスキル ―データをビジネスの意思決定に繋げるために
現代社会は多くのデータで溢れていますが、価値はデータや予測ではなく、意思決定によって生まれます。本書では、データの分析スキルを、ビジネス上の課題をより良い意思決定をもって処方的に解決するための能力であるとし、多くのユースケースを交えて解説します。ビジネス上の問いの立て方からスタートし、達成したい成果を明らかにした上でそのためのアクションを逆算していく。不確実性や因果関係の処理によって生み出される問題なども詳しく論じます。
book
マスタリングOkta ―IDaaS設計と運用
IDaaS(クラウドベースの認証サービス)として急速にシェアを拡大しつつあるOktaについて、主に管理者の視点から各種機能の具体的な使用方法について解説した書籍です。Oktaが有する機能の基本となる「UD(Universal Directory)」、「SSO(Single Sign-On)」、「AMFA(Adaptive Multi-Factor Authentication)」、「LCM(Life Cycle Managemant)」などはもちろん、APIアクセス管理やAdvanced Server Access(ASA)など高度な機能についても触れ、網羅的に解説しています。個別の機能に関する具体的な設定方法について実際の画面のスクリーンショットも豊富でわかりやすく、またOktaがどのような機能を有しているかを俯瞰する上でも役立ちます。
book
スクラム実践者が知るべき97のこと
アジャイル開発手法のなかで最もよく使われる手法の1つがスクラムです。スクラムは、複雑な問題に取り組むためのシンプルなフレームワークであり、シンプルであるがゆえに実践には要所を押さえるスキルが必要になります。本書は、世界中で活躍するスクラム専門家が自らの経験と知見に基づいて執筆したエッセイ集です。スクラム適用の戦略、スクラムで進める上での戦術やパターン、さまざまな職種のコラボレーション、組織への影響などについて幅広い視点で紹介します。日本語版では、及部 敬雄、小林 恭平(kyon_mm)、高橋 一貴、長沢 智治、平鍋 健児、安井 力(やっとむ)、和田 卓人、永瀬 美穂、原田 騎郎、吉羽 龍太郎による10本の書下ろしを収録。
book
ドメイン駆動設計をはじめよう ―ソフトウェアの実装と事業戦略を結びつける実践技法
ドメイン駆動設計はエリック・エヴァンスにより提唱されたソフトウェア設計の手法です。対象とする事業活動(ドメイン)とその課題の観点から、より良いソフトウェアを構築するために関係者が協力する方法を提供します。本書は4部構成になっており、第Ⅰ部「設計の基本方針」では、ソフトウェアの設計方針を大きな視点から決めるための考え方とやり方を取り上げます。第Ⅱ部「実装方法の選択」ではソースコードに焦点を合わせ、業務ロジックをどう実装するかの選択肢を学びます。第Ⅲ部「ドメイン駆動設計の実践」では、ソフトウェア開発の現場にドメイン駆動設計を実践的に取り入れるための方法を紹介します。第Ⅳ部「他の方法論や設計技法との関係」では、ドメイン駆動設計とそれ以外の方法論や設計技法との関係を検討します。最新の技術トレンドを取り入れながら、ドメイン駆動設計の基本概念と実践方法をわかりやすく解説します。