メインコンテンツへスキップ

Go Proposal Weekly Digest

Go言語のproposal更新を毎週お届け

#78612likely_decline

uuid: rename Nil to Zero

新規提案

要約

AIによる要約であり、誤りを含む場合があります。

概要

Go標準ライブラリに追加予定のuuidパッケージにおいて、RFC 9562で「Nil UUID」と定義されているゼロ値UUID(00000000-0000-0000-0000-000000000000)を返す関数の名称をNil()からZero()に変更することを提案するissueです。

ステータス変更

(新規)likely_decline
2026年4月15日のProposal Reviewミーティング(@aclements、@griesemer、@ianlancetaylor、@neild他)において、Nilという名称を維持する方向が優勢として「likely decline」に分類されました。RFC 9562が「Nil UUID」と定義していること、およびgithub.com/google/uuidgofrs/uuidなど既存の主要パッケージがNilという名前を使用していることが決め手となっています。

技術的背景

現状の問題点

uuid.Nil()という名称は、Go言語におけるnilの意味(ポインタ・インターフェース・スライス等のゼロ値)と混同を招く可能性があります。UUIDの基底型は[16]byteという値型であり、Goの意味では決してnilになりません。@rogpeppeによる元の指摘(issue #62026のコメント)では、nilはGoで明確に定義された概念であるため、配列の「ゼロ値」を表すにはZeroが適切であると主張しています。

// 現在の提案(uuid パッケージ)
func Nil() UUID // 00000000-0000-0000-0000-000000000000 を返す
// このissueが提案する変更
func Zero() UUID // 同じ値を返すが、Go慣用語に沿った名前

提案された解決策

uuid.Nil()uuid.Zero()に改名し、Godocにて「RFC 9562ではNil UUIDとも呼ばれる」と注記する。あわせてUUID.IsZero() boolメソッドの追加も議論されましたが、UUIDのゼロ値はUUID{}そのものと一致するため、@neilдの見解として「IsZeroは型のゼロ値と論理的なゼロが異なる場合(例:time.Time.IsZero())に使うべきもの」として否定的に評価されています。

これによって何ができるようになるか

このproposalが受理された場合、Go慣用語に沿った命名でゼロUUIDを扱えるようになります。

  • time.Time.IsZero()image.ZR(ゼロ矩形)と一貫したAPIスタイル
  • uuid.Zero()uuid.Max()で数値範囲の両端を表現でき、UUID.Compareとの意味的整合性が向上
  • if id == (uuid.UUID{}) {という構文上の括弧が不要になる

コード例

// Before: ゼロUUIDの比較(括弧が必要で煩雑)
if id == (uuid.UUID{}) {
    // Nil UUIDの処理
}
// After(このproposalが通った場合): Zero()を使った比較
if id == uuid.Zero() {
    // ゼロUUIDの処理
}
// 現在承認済みの名称(likely declineなので変更されない可能性が高い)
if id == uuid.Nil() {
    // Nil UUIDの処理
}

議論のハイライト

  • 名称変更のトリガー: @rogpeppeがissue #62026のコメントで「nilはGoで明確に定義された概念であり、配列は決してnilにならない。Zeroを使うべき」と指摘したことで本issueが派生した。
  • @neilдの反論: RFC 9562が「Nil UUID」と定義している、google/uuidgofrs/uuidなど既存パッケージがNilを使っている、Goの型チェッカーが誤用を防ぐ、という3点からNil維持を主張。
  • 外部仕様優先の原則: @neilдはGoogle内部のSpanner APIの設計経験を引いて「外部仕様が定めた名前は、言語ごとの命名慣習より優先すべき」という見解を示した。
  • func Nil() UUIDへの変更の問題: 既存のgoogle/uuidにはvar Nil = UUID{}(変数)があるため、func Nil() UUID(関数)に変えるとjson.Encode(map[string]any{"id": uuid.Nil})のようなコードがコンパイルは通るが関数値を渡す挙動になりサイレントバグが発生する、という指摘が@AGWAよりなされた。
  • 「何も追加しない」という選択肢: @neilдは「Zero()に改名するなら、uuid.UUID{}と同等であり追加する意義そのものが失われる」と問題提起し、proposalの存在意義を根本から問い直した。
  • 現在の結論: Proposalレビューグループは「完璧な選択肢はないが、Nilを維持する論拠の方が強い」としてlikely declineと判断。最終コメント受付期間中(Final Comment Period)。

関連リンク