proposal: blanket approval for String and GoString methods
要約
概要
Goのプロポーザルプロセスそのものを改善するメタプロポーザル。既存の型に String() または GoString() メソッドを追加するだけの変更を、通常のプロポーザル審査プロセスから免除することを提案している。
ステータス変更
(新規) → active
2026年6月24日に行われたweekly proposal review meetingで議事録に追記され、aclementsによって2026年6月25日にactiveカラムへ移動された。現在は毎週のプロポーザルレビュー会議での継続審議対象となっている。
技術的背景
現状の問題点
Go標準ライブラリや関連パッケージに、デバッグ・ロギング目的で既存の型へ String() / GoString() メソッドを追加したい場合、通常は1〜2ヶ月かかるプロポーザルレビュープロセスを経る必要がある。
これらのメソッドは fmt.Stringer / fmt.GoStringer インターフェースを満たすためのものであり、以下のように用途が明確で影響範囲も限定的:
String() string:fmt.Printfの%s・%vフォーマット等で使われる人間可読表現GoString() string:fmt.Printfの%#vフォーマットで使われるGo構文表現
このような低リスクな変更に対しても重い審査プロセスが必要な現状は、開発速度の面でオーバーヘッドとなっている。
提案された解決策
既存の型に対して String() または GoString() メソッドを追加するだけの変更は、出力フォーマットについて「ざっくりとした説明」のみ記載すれば、プロポーザル委員会のレビューや1〜2ヶ月の待機期間を免除する。
提案者(@adonovan)が示す免除対象の典型例:
// String returns a human-readable representation of a Thing suitable for debugging.
func (Thing) String() string
// GoString returns a fuller description of a Thing than [Thing.String].
func (Thing) GoString() string
これによって何ができるようになるか
標準ライブラリのメンテナーが、デバッグ用のメソッド追加を迅速に行えるようになる。
具体的なシナリオ:
go/typesパッケージの新しい型に診断目的でString()を付与したい場合、プロポーザル不要で即座に実装できるnetパッケージの内部構造型にGoString()を追加してデバッグを容易にしたい場合も、同様に審査を省略できる- ライブラリ作者が
fmt.Stringer準拠メソッドをイテレーティブに改善するサイクルが大幅に短縮される
コード例
// Before: 現状では以下のような追加にもプロポーザルが必要
// → issue提出 → 委員会レビュー → 1〜2ヶ月待機 → 実装
// After: 免除対象になれば、コードレビューのみで追加可能
// String returns a human-readable representation of a Cursor suitable for debugging.
func (c Cursor) String() string {
return fmt.Sprintf("Cursor{%T @ %d}", c.node, c.pos)
}
// GoString returns a Go-syntax representation of a Cursor.
func (c Cursor) GoString() string {
return fmt.Sprintf("ast.Cursor{...}")
}
実際に、このissueが作成された時期とほぼ同時期(2026年6月)に go/types/internal/play への Cursor パス表示機能を追加するCL(https://go.dev/cl/790900)がこのissueを参照しており、具体的なユースケースが存在することが確認できる。
議論のハイライト
- 免除条件の範囲: @dmitshur(Goチームメンバー)は、
GoString()の説明として「String()より詳細な記述」という表現は、fmt.GoStringerインターフェース本来の意図(Go構文を表現する)からずれる可能性があると指摘。「出力フォーマットについてのざっくりとした説明」の条件として、fmt.Stringer/fmt.GoStringerインターフェースが定める高レベルの期待(それぞれ人間可読表現・Go構文表現)に従うことを追加条件とすべきとコメントしている - メタプロポーザルとしての性格: これはGo言語やAPIの変更提案ではなく、Goのプロポーザルガバナンスそのものを効率化するメタプロポーザルである。承認されると、今後の
String()/GoString()追加PR群が自動的に恩恵を受ける - リスクの低さ:
String()/GoString()メソッドは、既存の型の動作に影響を与えない純粋な追加変更。後方互換性を壊さず、既存コードへの影響がほぼゼロであることが免除の根拠 - 出力フォーマット仕様の扱い: 出力フォーマットを厳密に仕様化しない(「ざっくりとした説明のみ」)ことを前提としており、将来の実装変更の柔軟性を保持する設計
- 2026年6月24日のmeetingで議事録追記: まだ「added to minutes」段階であり、委員会内の議論はこれから本格化する見込み