この章では、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を書くすべての開発者にとっての基本の「型」となる内容です。