0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

実用Go言語 第1章「Goらしさに触れる」まとめ

Posted at

この章では、Go言語の設計思想や、他の言語と異なるGoらしい特徴について紹介されています。
変数名の付け方からエラーハンドリング、メモリ最適化や時刻処理まで、実践的な知識が詰まった章です。

1.1 名前付けの慣習

1.1.1 変数名

  • _は使用しない
  • 頭文字後は大文字にする(例:UrlでななくURL など)
  • エラーの変数名には接尾語にError
  • 短くても意味が分かる名前が推奨される(例:requestでななくreq など)
  • Goではスコープが狭い場面で短い名前が好まれる

1.1.2 パッケージ名

  • main 以外はすべて小文字単語1つが原則
  • 使用例:fmt, io, bytes

1.1.3 インタフェース名

  • 動詞+erで命名(例:Reader, Writer
  • 小さなインタフェースが好まれる

1.1.4 レシーバー名

  • 短い1〜2文字(例:s, t, r
  • メソッドの対象を表す

1.2 定数の使い方

1.2.1 型のない定数

  • const Pi = 3.14 のように型なしで定義可能(暗黙型変換に便利)

1.2.2 型付き定数

  • 明示的に型を指定する場合: const Timeout time.Duration = 3 * time.Second

1.2.3 他言語との違い

  • Goは「定数=狭い用途でしか使えず厳格」として重視される

1.2.4 error型の定数

  • エラーもconstで定義して使い回すことが多い(例:ErrNotFound

1.3 iotaによる列挙型

1.3.1 ユニークな定数列

  • 自動でインクリメントされるため列挙型に便利

1.3.2 iotaの挙動

  • 定数ブロック内で0から始まり1ずつ増加

1.3.3 ビットフラグとして利用

  • 1 << iotaでビットごとのフラグを表現可能

1.3.4 適さないケース

  • 途中で番号が飛ぶ・外部との互換性がある場合は避ける

1.3.5 文字列として出力

  • Stringerインタフェースを実装することで定数値を人間が読める文字列に変換可能

1.4 エラーハンドリング

1.4.1 Goのエラーは値

  • エラーは単なる値(error型)、if文で都度チェック

1.4.2 panic()は原則使わない

  • 想定外の致命的な状況でのみ使用

1.4.3 エラーハンドリング

  • if err != nilパターンが基本

1.4.4 他言語との違い

  • 例外を使わず、明示的な戻り値による制御を重視

1.5 :=とvarの使い分け

  • 基本的には :=(短縮宣言)が推奨
  • グループ定義や関数外ではvarを使う

1.6 オプション引数の実現

1.6.1 関数を分ける

  • NewDefaultUser()NewUserWithName()のように用途別関数

1.6.2 構造体を使う

  • 引数構造体を定義し、柔軟にオプションを渡す

1.6.3 ビルダーパターン

  • 段階的に設定値を構築して渡す

1.6.4 Functional Optionパターン

  • クロージャを使ってオプション指定

1.6.5 どれを選ぶか

  • シンプルな関数が1〜2個程度なら「関数分け」や「構造体」が十分
  • 複雑・柔軟性が求められるならFunctional Option

1.7 プログラムを制御する引数

1.7.1 コマンドライン引数

  • flagパッケージなどで簡単に取得できる

1.7.2 環境変数

  • os.Getenv() を使用

1.8 メモリ起因のパフォーマンス低下を解消する

1.8.1 スライス

  • make([]T, len, cap)で事前に容量確保するとGC効率が改善

1.8.2 マップ

  • make(map[K]V, size)で初期容量を設定すると効率化

1.8.3 deferの落とし穴

  • 多用するとパフォーマンス低下に繋がる場面もある(特にループ内)

1.9 文字列の結合方法

  • strings.Builderを活用すれば効率的に連結可能

1.10 日時の取り扱い

1.10.1 time.Timeの取得

  • time.Now() で現在時刻取得、UTC()Local()で変換可能

1.10.2 time.Duration

  • 時間差を表す型。1*time.Second, 500*time.Millisecond など

1.10.3 Webとのやり取り

  • ISO8601形式(RFC3339)で文字列変換して送信:t.Format(time.RFC3339)

1.10.4 翌月を計算する落とし穴

  • AddDate(0, 1, 0)で「翌月の同じ日」を取得するが、月末処理に注意(例:1月31日→2月28日)

✅ まとめ

この章では、Goにおける明確な設計思想(シンプル・明示的・高速)がよく表れていました。

  • 名前付け → 明確で簡潔に
  • 定数・iota → 安全なコードのために活用
  • エラー処理 → 例外よりも戻り値
  • メモリ・パフォーマンス → 予測可能な設計

Goを書くすべての開発者にとっての基本の「型」となる内容です。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?