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

Go Proposal Weekly Digest

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

#76975active

cmd/gofmt: don't rewrite into smart quotes

新規提案

要約

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

概要

gofmt が doc コメント内のシングルクォート '' をスマートクォート(Unicode の " / ")へ自動書き換えする機能を、完全に無効化することを提案。ユーザーが意図しない文字がソースコードに挿入される問題を解決する。

ステータス変更

(なし)active
2026年6月17日のプロポーザルレビュー会議(@cherrymui, @griesemer, @ianlancetaylor, @neild)にて、週次レビュー対象のアクティブキューに追加された。関連する既存プロポーザル #54312 との整合性を含め、正式な議論が始まった段階。

技術的背景

現状の問題点

Go 1.19 で実装されたプロポーザル #51082(go/doc/comment パッケージによる doc コメントの構造化)の一環として、gofmt は doc コメント内のバッククォート2つ `` とシングルクォート2つ '' をそれぞれ Unicode スマートクォート "" に書き換えるようになった。
この自動書き換えには複数の問題がある。

  1. 不可視の変更: 多くのフォントでスマートクォートとストレートクォートは外見上ほぼ区別がつかず、diff を取るまで気付かない
  2. 無効なコード例: コメント内にコード例として `` を含む場合、書き換え後は Go の構文として無効になる
  3. 検索の失敗: ソースコード内で ``grep しても、書き換え済みのファイルでは一致しない
  4. キーボードで入力できない文字の挿入: gofmt がユーザーの打鍵に存在しない文字(Unicode スマートクォート)をソースファイルに書き込むのは、従来の gofmt の哲学(空白の整形のみ)から外れる
  5. kubebuilder などとの非互換: // +kubebuilder:validation:...,rule="... == ''" のように空文字列リテラルとして '' を使うアノテーションが誤変換される
// Raw quotes are Go-like and bounded by ``.

このコメントを含むファイルに gofmt を実行すると、出力は以下のように変わる。

// Raw quotes are Go-like and bounded by ".

フォントによっては両者がピクセル単位で同一に見えるため、差分を取らない限り変更に気付けない。

提案された解決策

go/doc/comment パッケージにおけるスマートクォートへの書き換えを完全に無効化する。すでに関連する CL 732420 が go/doc/comment: never rewrite into smart quotes として提出されている。

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

  • gofmt を実行してもコメント内のクォート文字が変化しなくなる
  • doc コメント内のコード例がそのまま保持される
  • grep や全文検索がフォーマット前後で一貫して動作する

コード例

// Before: gofmt 実行後(現在の挙動)
// SQL では '' で空文字列を表し、'foo''bar' は "foo'bar" を意味する。
// Raw string literals are bounded by ".
// Complexity is O(n²).
// After: 提案適用後(gofmt が書き換えを行わない)
// SQL では '' で空文字列を表し、'foo''bar' は 'foo''bar' のまま保持される。
// Raw string literals are bounded by ``.
// Complexity is O(n²).

議論のハイライト

  • griesemer(コアチームメンバー): 「gofmt は空白の整理だけをすべき」と当初から明確に賛成。-s-r オプションによる書き換えも「今やるなら別ツールにしていた」と歴史的経緯を認める発言をした
  • #54312 との関係: 2024年に承認済みのプロポーザル #54312 は「書き換えルールを厳密化する(一部は残す)」という方向で承認されているが未実装。本プロポーザルはそれより踏み込んで「完全廃止」を求めており、両者の整合性がレビュー委員会で検討される
  • N=1 問題: 複数の参加者が「スマートクォート書き換えを積極的に望む人はほぼ @rsc 一人ではないか」と指摘。seankhliao は「最も驚きの少ない動作は書き換えをしないこと」と述べた
  • 後方互換性: 既にスマートクォートに変換済みのコードは変更されない。変換を好む人は引き続きエディタマクロなどで手動入力できるため、書き換えを廃止しても影響は最小限と評価されている
  • 実害の具体例: #61365 では SQL の ''(空文字列)が " に変換されてドキュメントの意味が変わった報告、#56380 では kubebuilder アノテーション内の '' が変換される問題が報告されており、実被害は複数のエコシステムに及んでいる

関連リンク