初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド

Book description

イディオマティックなGo言語の解説書。構文がシンプル、静的型付け、タイプセーフでメモリセーフ、バグが入り込みにくい、並行処理が得意、実行速度が速い……これらの魅力的な特徴を生かすためには、Go言語らしい書き方を可能にする「イディオム」を学ぶ必要があります。Go言語のイディオムをマスターすれば、効率的で読みやすいコードを書けます。本書では、Go言語の基本機能を明快かつ簡潔に説明しつつ、イディオマティックなGoコードの書き方やGoプロジェクトの設計方法を解説します。読者はベテランのGo開発者のように考える術を学べます。

Table of contents

  1.  大扉
  2.  原書大扉
  3.  クレジット
  4.  賞賛の声
  5.  訳者まえがき
  6.  まえがき
  7.  1章 Go環境のセットアップ
  8.   1.1 開発ツールのインストール
  9.   1.2 ディレクトリの指定
  10.   1.3 goコマンド
  11.    1.3.1 go run
  12.    1.3.2 go build
  13.    1.3.3 go mod
  14.    1.3.4 go install
  15.    1.3.5 コードのフォーマット
  16.      セミコロン挿入規則
  17.   1.4 lintとvet
  18.   1.5 ツールの選択
  19.    1.5.1 Visual Studio Code
  20.    1.5.2 GoLand
  21.    1.5.3 Go Playground
  22.   1.6 Makefile
  23.   1.7 開発環境やバイナリファイルの更新
  24.   1.8 まとめ
  25.  2章 基本型と宣言
  26.   2.1 基本型
  27.    2.1.1 ゼロ値
  28.    2.1.2 リテラル
  29.     2.1.2.1 整数リテラル
  30.     2.1.2.2 浮動小数点数リテラル
  31.     2.1.2.3 runeリテラル
  32.     2.1.2.4 文字列リテラル
  33.     2.1.2.5 リテラルと型
  34.    2.1.3 論理型 bool
  35.    2.1.4 数値型
  36.     2.1.4.1 整数型
  37.     2.1.4.2 特別な整数型
  38.     2.1.4.3 整数型の選択
  39.     2.1.4.4 整数関連の演算子
  40.     2.1.4.5 浮動小数点数型
  41.      IEEE 754
  42.     2.1.4.6 複素数型
  43.    2.1.5 文字列型とrune型
  44.    2.1.6 明示的型変換
  45.   2.2 変数の宣言
  46.   2.3 定数
  47.   2.4 型付きの定数と型のない定数
  48.   2.5 未使用変数
  49.      未使用の定数
  50.   2.6 変数および定数の名前
  51.   2.7 まとめ
  52.  3章 合成型
  53.   3.1 配列
  54.   3.2 スライス
  55.    3.2.1 len
  56.    3.2.2 append
  57.    3.2.3 スライスのキャパシティ
  58.      Goのランタイム
  59.    3.2.4 make
  60.    3.2.5 スライスの生成方法の選択
  61.    3.2.6 スライスのスライス
  62.     3.2.6.1 スライスの記憶領域の共有
  63.    3.2.7 配列からスライスへの変換
  64.    3.2.8 メモリを共有しないスライスのコピー
  65.   3.3 文字列、rune、バイト
  66.      UTF-8
  67.   3.4 マップ
  68.      ハッシュマップ
  69.    3.4.1 マップの読み書き
  70.    3.4.2 カンマokイディオム
  71.    3.4.3 マップからの削除
  72.    3.4.4 マップとセット
  73.   3.5 構造体
  74.    3.5.1 無名構造体
  75.    3.5.2 構造体の比較と変換
  76.   3.6 まとめ
  77.  4章 ブロック、シャドーイング、制御構造
  78.   4.1 ブロック
  79.    4.1.1 変数のシャドーイング
  80.    4.1.2 シャドーイングされた変数の検知
  81.      ユニバースブロック
  82.   4.2 if
  83.   4.3 for
  84.    4.3.1 標準形式のfor文
  85.    4.3.2 条件のみのfor文
  86.    4.3.3 無限ループ
  87.    4.3.4 breakとcontinue
  88.    4.3.5 for-rangeループ
  89.     4.3.5.1 マップのイテレーション
  90.     4.3.5.2 文字列を対象にしたイテレーション
  91.     4.3.5.3 for-rangeの値はコピー
  92.    4.3.6 ラベル
  93.    4.3.7 for文の選択
  94.   4.4 switch
  95.    4.4.1 switchの基本構文
  96.    4.4.2 ブランクswitch
  97.    4.4.3 break
  98.   4.5 ifかswitchか
  99.   4.6 goto
  100.   4.7 まとめ
  101.  5章 関数
  102.   5.1 関数の宣言と呼び出し
  103.    5.1.1 名前付き引数とオプション引数
  104.    5.1.2 可変長引数とスライス
  105.    5.1.3 複数の戻り値
  106.    5.1.4 戻る複数の値のPythonとの違い
  107.    5.1.5 戻り値の無視
  108.    5.1.6 名前付き戻り値
  109.    5.1.7 ブランクreturn
  110.   5.2 関数は値
  111.    5.2.1 関数型の宣言
  112.    5.2.2 無名関数
  113.   5.3 クロージャ
  114.    5.3.1 関数引数
  115.    5.3.2 関数から関数を返す
  116.   5.4 defer
  117.   5.5 Goは値渡し
  118.   5.6 まとめ
  119.  6章 ポインタ
  120.   6.1 ポインタ入門
  121.   6.2 ポインタを恐れる必要はない
  122.   6.3 ポインタはミュータブル(変更可能)の印
  123.   6.4 ポインタは最後の手段
  124.   6.5 ポインタ渡しのパフォーマンス
  125.   6.6 「ゼロ値」と「値なし」
  126.   6.7 マップとスライスの違い
  127.   6.8 バッファとして使うスライス
  128.   6.9 ガベージコレクタの負荷軽減策
  129.   6.10 まとめ
  130.  7章 型、メソッド、インタフェース
  131.   7.1 Goの型
  132.    7.1.1 抽象型と具象型
  133.    7.1.2 基底型
  134.    7.1.3 型の定義
  135.   7.2 メソッド
  136.    7.2.1 ポインタ型レシーバと値型レシーバ
  137.    7.2.2 nilへの対応
  138.    7.2.3 メソッドは関数
  139.    7.2.4 関数とメソッドの使い分け
  140.    7.2.5 型宣言と継承の違い
  141.    7.2.6 型は実行可能なドキュメント
  142.    7.2.7 iotaと列挙型
  143.   7.3 埋め込みによる合成
  144.   7.4 埋め込みと継承の違い
  145.   7.5 インタフェースとは
  146.      インタフェースは型安全なダックタイピング
  147.   7.6 埋め込みとインタフェース
  148.   7.7 インタフェースを受け取り構造体を返す
  149.   7.8 インタフェースとnil
  150.   7.9 空インタフェース
  151.   7.10 型アサーションと型switch
  152.    7.10.1 型アサーション
  153.    7.10.2 型switch
  154.   7.11 型アサーションと型switchの使用は控えめに
  155.   7.12 関数型とインタフェース
  156.   7.13 暗黙のインタフェースによる依存性注入
  157.   7.14 依存性注入コードの生成
  158.   7.15 Goはさほどオブジェクト指向ではない
  159.   7.16 まとめ
  160.  8章 エラー処理
  161.   8.1 エラー処理の基本
  162.   8.2 単純なエラーの際の文字列の利用
  163.   8.3 センチネルエラー
  164.      センチネルエラーのための定数の利用
  165.   8.4 エラーと値
  166.   8.5 エラーのラップ
  167.   8.6 IsとAs
  168.   8.7 deferを使ったエラーのラップ
  169.   8.8 パニックとリカバー
  170.   8.9 エラー時のスタックトレースの取得
  171.   8.10 まとめ
  172.  9章 モジュールとパッケージ
  173.   9.1 リポジトリ、モジュール、パッケージ
  174.   9.2 モジュールとgo.modファイル
  175.   9.3 パッケージの構築
  176.    9.3.1 インポートとエクスポート
  177.    9.3.2 パッケージの作成とアクセス
  178.    9.3.3 パッケージの命名法
  179.    9.3.4 モジュールの構成方法
  180.    9.3.5 パッケージ名のオーバーライド
  181.    9.3.6 パッケージのコメントとgodoc
  182.    9.3.7 内部パッケージ
  183.    9.3.8 init関数
  184.    9.3.9 循環参照
  185.    9.3.10 名称変更や再構成
  186.   9.4 モジュール関連の操作
  187.    9.4.1 サードパーティーのコードのインポート
  188.    9.4.2 モジュールのバージョン
  189.      セマンティックバージョニング
  190.    9.4.3 ミニマルバージョン選択
  191.    9.4.4 互換性をもつバージョンへのアップデート
  192.    9.4.5 非互換のバージョンへのアップデート
  193.    9.4.6 ベンダリング
  194.    9.4.7 pkg.go.devサイト
  195.   9.5 モジュールの公開
  196.   9.6 モジュールのバージョンの決定
  197.   9.7 モジュールプロキシサーバ
  198.    9.7.1 プロキシサーバの指定
  199.    9.7.2 プライベートなリポジトリ
  200.   9.8 まとめ
  201.  10章 並行処理
  202.   10.1 並行性をいつ利用するべきか
  203.   10.2 ゴルーチン
  204.   10.3 チャネル
  205.    10.3.1 読み込み、書き込み、バッファリング
  206.    10.3.2 for-rangeとチャネル
  207.    10.3.3 チャネルのクローズ
  208.    10.3.4 チャネルの動作
  209.   10.4 select
  210.   10.5 並行処理のベストプラクティスとパターン
  211.    10.5.1 APIに並行性は含めない
  212.    10.5.2 ゴルーチンとforループ
  213.    10.5.3 ゴルーチンの終了チェック
  214.    10.5.4 doneチャネルパターン
  215.    10.5.5 キャンセレーション関数を用いたゴルーチンの終了
  216.    10.5.6 いつバッファ付きのチャネルを使うべきか
  217.    10.5.7 バックプレッシャ
  218.    10.5.8 selectにおけるcaseの無効化
  219.    10.5.9 タイムアウト
  220.    10.5.10 WaitGroupの利用
  221.      golang.org/xとerrgroup
  222.    10.5.11 コードを一度だけ実行
  223.    10.5.12 並行処理ツールの協調
  224.   10.6 チャネルの代わりにミューテックスを使うべきとき
  225.      sync.Map
  226.   10.7 sync/atomic
  227.   10.8 まとめ
  228.  11章 標準ライブラリ
  229.   11.1 入出力
  230.   11.2 time
  231.    11.2.1 時間
  232.    11.2.2 時刻
  233.    11.2.3 モノトニックタイム
  234.    11.2.4 タイマーとタイムアウト
  235.   11.3 encoding/json
  236.    11.3.1 構造体タグを使ったメタデータの付加
  237.    11.3.2 アンマーシャリングとマーシャリング
  238.    11.3.3 JSONのリーダーとライター
  239.    11.3.4 JSONストリーミングのエンコードとデコード
  240.    11.3.5 JSON解析のカスタマイズ
  241.   11.4 net/http
  242.    11.4.1 クライアント
  243.    11.4.2 サーバ
  244.     11.4.2.1 ミドルウェア
  245.     11.4.2.2 サーバ強化のためのイディオム的なサードパーティーモジュールの追加
  246.   11.5 まとめ
  247.  12章 コンテキスト
  248.   12.1 コンテキストとは
  249.   12.2 キャンセレーション
  250.   12.3 タイマー
  251.   12.4 独自コードにおけるキャンセレーションの処理
  252.   12.5 コンテキストによる値の伝搬
  253.   12.6 まとめ
  254.  13章 テスト
  255.   13.1 テストの基礎
  256.    13.1.1 テスト失敗のレポート
  257.    13.1.2 設定の適用と解除
  258.    13.1.3 テスト用サンプルデータの保存
  259.    13.1.4 テスト結果のキャッシング
  260.    13.1.5 公開APIのテスト
  261.    13.1.6 go-cmpによるテスト結果の比較
  262.   13.2 テーブルテスト
  263.   13.3 コードカバレッジのチェック
  264.   13.4 ベンチマーク
  265.      Goコードのプロファイリング
  266.   13.5 スタブ
  267.      モックとスタブ
  268.   13.6 httptest
  269.   13.7 統合テストとビルドタグ
  270.      フラグ-shortの使用
  271.   13.8 並行実行に関する問題とレースチェッカー
  272.   13.9 まとめ
  273.  14章 リフレクション、unsafe、cgo
  274.   14.1 リフレクション
  275.    14.1.1 型(type)、型情報(kind)、値(value)
  276.     14.1.1.1 型(type)と型情報(kind)
  277.     14.1.1.2 値(value)
  278.    14.1.2 新しい値の生成
  279.    14.1.3 インタフェースの値のnilチェック
  280.    14.1.4 データのマーシャリングのためのリフレクション
  281.    14.1.5 リフレクションで作った関数による繰り返し処理の自動化
  282.    14.1.6 構造体とリフレクション
  283.    14.1.7 リフレクションとメソッド
  284.    14.1.8 リフレクションを利用するべきとき
  285.   14.2 unsafe
  286.    14.2.1 unsafeを使ったバイナリデータの変換
  287.    14.2.2 unsafeな文字列とスライス
  288.    14.2.3 unsafe関連ツール
  289.   14.3 cgo
  290.   14.4 まとめ
  291.  15章 ジェネリクス
  292.   15.1 ジェネリクスによる繰り返しの削減と型安全性の向上
  293.   15.2 Go言語のジェネリクスの概要
  294.   15.3 ジェネリック関数によるアルゴリズムの抽象化
  295.    15.3.1 ジェネリクスとインタフェース
  296.   15.4 型タームを使った演算子の指定
  297.    15.4.1 型推論とジェネリクス
  298.    15.4.2 型要素による定数の制約
  299.    15.4.3 ジェネリック関数とジェネリックなデータ構造の利用
  300.   15.5 今後追加される可能性のある機能
  301.   15.6 イディオム的Goとジェネリクス
  302.   15.7 タグ付き共用体の可能性
  303.   15.8 まとめ
  304.  付録A Go言語のまとめ
  305.   A.1 ほかの言語で(あまり)見られない点
  306.   A.2 型とゼロ値
  307.    A.2.1 基本型(組み込み型)
  308.    A.2.2 合成型(複合データ型、コンテナ型)、その他
  309.   A.3 変数と定数の宣言
  310.    A.3.1 基本型の変数の宣言
  311.    A.3.2 配列とスライスの宣言
  312.    A.3.3 スライスへの要素の追加
  313.    A.3.4 サブスライス(スライスの要素の削除)
  314.    A.3.5 マップの宣言とリテラル
  315.    A.3.6 makeを使ったスライスやマップの生成
  316.    A.3.7 定数の宣言
  317.   A.4 構造体の宣言とリテラル
  318.   A.5 型のエイリアス
  319.   A.6 iota
  320.   A.7 制御構造
  321.    A.7.1 ifとforの基本形
  322.    A.7.2 for-rangeの例
  323.    A.7.3 switch
  324.   A.8 演算子
  325.   A.9 関数
  326.   A.10 メソッド
  327.   A.11 継承
  328.   A.12 インタフェース
  329.   A.13 ゴルーチン
  330.    A.13.1 チャネルからの読み込みのパターン
  331.     A.13.1.1 変数への代入
  332.     A.13.1.2 無視する
  333.     A.13.1.3 select文のcaseでの代入
  334.     A.13.1.4 for-rangeループ
  335.   A.14 Goの「イディオム」
  336.    A.14.1 イディオム的なもの
  337.    A.14.2 「イディオム的」でない例
  338.    A.14.3 その他、Goの「哲学」が感じられる選択
  339.    A.14.4 備忘録
  340.  付録B 実例で学ぶGo言語入門
  341.   B.1 予備知識
  342.    B.1.1 Go言語のコードの留意点
  343.   B.2 fmtパッケージの動詞(verb)
  344.    B.2.1 例題ディレクトリの構成
  345.    B.2.2 プログラムの実行
  346.    B.2.3 実行結果
  347.   B.3 基本構文と標準入出力
  348.    B.3.1 例外処理
  349.    B.3.2 関数とループ
  350.    B.3.3 switch文
  351.    B.3.4 日本語の識別子
  352.   B.4 コマンド行計算機——コマンド行引数、文字列の置換と正規表現、外部コマンド
  353.   B.5 ファイルの入出力
  354.    B.5.1 ファイルの内容を一度に読み込み
  355.    B.5.2 ファイルを1行ずつ処理
  356.    B.5.3 練習問題
  357.   B.6 ゴルーチン、チャネル、WaitGroup
  358.    B.6.1 チャネルを使った単純な例
  359.    B.6.2 ウェブサイトのチェック——WaitGroup版
  360.    B.6.3 ウェブサイトのチェック——チャネル版
  361.   B.7 まとめ
  362.  著者紹介
  363.  奥付

Product information

  • Title: 初めてのGo言語 ―他言語プログラマーのためのイディオマティックGo実践ガイド
  • Author(s): Jon Bodner, 武舎 広幸
  • Release date: September 2022
  • Publisher(s): O'Reilly Japan, Inc.
  • ISBN: 9784814400041

You might also like

book

大規模データ管理 ―エンタープライズアーキテクチャのベストプラクティス

by Piethein Strengholt, 村上 列

データ管理と統合が急速に進化する中、複雑で緊密に結合したアーキテクチャから、現代のビジネスに対応できる、より柔軟なデータアーキテクチャへの移行が求められます。 本書は、変化が激しい時代でも長期的に持続可能な方法で大規模なデータ管理を行い、さまざまなユースケースに対応できる統合アーキテクチャを紹介します。この統合アーキテクチャを構成する、膨大なデータ利用に向けた「読み出し専用データストアアーキテクチャ」、リアルタイムなアプリケーションのための「APIアーキテクチャ」、大容量のスループットを実現する「ストリーミングアーキテクチャ」を詳述します。また技術開発、法規制、プライバシーに関する懸念など、データ管理全体を説明し、データガバナンスとセキュリティ、マスターデータ管理、セルフサービスとデータマーケットプレイス、メタデータの重要性について解説します。 企業のデータ戦略にかかわる本書は、アーキテクトはもちろん、経営者、ガバナンスチーム、データ分析・エンジニアリングチーム必携の一冊です。

book

データベースリライアビリティエンジニアリング ―回復力のあるデータベースシステムの設計と運用

by Laine Campbell, Charity Majors, 八木 和生

テクノロジーの進化に合わせて、データベースもまた進化しています。従来のパフォーマンス、スケーラビリティが重要なことはもちろん、今日ではセキュリティ、インフラのコード化、CI/CD、クラウド活用といったタスクにも取り組んでいかなければなりません。 データベースの本質は、長期的に安定していること。つまりリライアビリティ(信頼性)です。時代とともにアーキテクチャやツールが変わってもこの原則は変わりません。本書はデータベースのリライアビリティを実現するための考え方を「データベースリライアビリティエンジニアリング」と定義して、その具体的な手法を紹介します。サービスのリライアビリティに関わるすべてのエンジニア必読の一冊です。

book

SQLではじめるデータ分析 ―クエリで行う前処理、時系列解析、コホート分析、テキスト分析、異常検知

by Cathy Tanimura, 大橋 真也, 嶋田 健志, 木下 哲也

クラウドの普及とともに、SQLの利用範囲は拡大し、データサイエンティストもデータベースを直接扱う機会が増えています。本書は、データ分析に関わるSQLのテクニックを学び、分析プロセスにおいてSQLを最大限に活用するためのものです。時系列解析などでは、SQLが日付・時刻の比較や処理に長けており、威力を発揮できる最たるものです。本書ではデータの前処理から始め、時系列解析、コホート分析、テキスト分析、異常検知など、SQLの操作を通じて高度なテクニックまで学ぶことができる構成になっています。サンプルコードはGitHubからダウンロード可能で、実際に手を動かしながら学ぶことができます。

book

リーンエンタープライズ ―イノベーションを実現する創発的な組織づくり

by Jez Humble, Joanne Molesky, Barry O'Reilly, 角 征典, 笹井 崇司, Eric Ries

新規事業を生み出し、顧客にすばやく価値を届けるには、それを支援する体制が必要です。本書は、あらゆるムダを省き、継続的に仮説検証を繰り返しながら、プロダクトやサービスを構築する「リーンスタートアップ」の手法を既存の企業に適用するための方法を説明します。市場環境や顧客ニーズの変化に対応し、イノベーションを加速させ、組織文化、ガバナンス、財務管理を最適化し続けるハイパフォーマンス組織になるための原則とパターンを、さまざまな成功企業のケーススタディとともに詳述します。