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

Go Proposal Weekly Digest

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

#76975accepted

cmd/gofmt: don't rewrite into smart quotes

ステータス変更: likely_accept accepted

要約

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

概要

gofmt(およびgo doc)がコメント中の連続するシングルクォート( ``や'')を自動的にスマートクォート(“”‘’)へ書き換える挙動を廃止する提案です。フォーマッタは空白の調整のみを行うべきだという方針に基づき、この自動変換をgo/formatgo/docの両方から取り除きます。

ステータス変更

likely_acceptaccepted
2026-07-08のミーティングで「likely accept」となった後、追加のコンセンサス変化がなかったため、2026-07-15に正式にacceptedとなりました。議論の中心は「この自動変換を積極的に望む声はほとんどなく、むしろ望まない声が多数を占める」という点にあり、コアチーム(@neild, @griesemer, @aclements)もこの結論に同意しました。

技術的背景

現状の問題点

Issue報告者は、gofmtを実行しただけでコメント中の ``(バッククォート2つ)が意図せず(左スマートクォート)に書き換えられ、フォント上見分けがつかないまま気づかぬうちにソースコードが変更されてしまう問題を報告しました。

% gofmt char.go > x
% diff char.go x
82c82
< // Raw quotes are Go-like and bounded by ``.
---
> // Raw quotes are Go-like and bounded by ".

この変換により、コメント中にコード例として `` や '' を含めても、その通りには保持されず、キーボードで直接入力できない文字(スマートクォート)が代わりに埋め込まれてしまいます。また、ソース内をバッククォートで検索しても該当箇所がヒットしなくなるなど、実用上の弊害も指摘されました。

提案された解決策

go/doc(ドキュメントレンダリング)とgo/formatgofmtが使用するパッケージ)の両方で、プレーンなクォートをスマートクォートへ変換する処理を完全に停止します。これに伴い、go docgofmtコマンド、およびpkgsiteでの自動スマートクォート化も無効化されます。
もともとこのgofmtでの変換は、go/docが行っていた同様の変換を「見える化」する目的でProposal #51082(2022年)により追加された経緯があります。今回はその逆方向の解決、つまりgo/doc側の変換もやめてgo/formatの挙動(変換しない)に合わせる形で決着しました。これにより、同じ問題意識から生まれていた別の提案 #54312(go/doc側だけ部分的にルールを見直す提案、acceptedだが未実装)は不要(obsolete)になります。

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

開発者はコメント中に自分が入力した文字がそのまま保持されることを期待できるようになり、コード例やシェルコマンドのスニペットをコメントに含めても意図せず改変されなくなります。

コード例

// Before(現行のgofmt/go doc挙動)
// Raw quotes are Go-like and bounded by ``.
//   → gofmt/go doc適用後: Raw quotes are Go-like and bounded by ".
//   (バッククォート2つが左右のスマートクォートに変換されてしまう)
// After(本提案適用後)
// Raw quotes are Go-like and bounded by ``.
//   → gofmt/go doc適用後もそのまま: Raw quotes are Go-like and bounded by ``.
//   (変換されず、入力した文字がそのまま保持される)

なお、スマートクォートを積極的に使いたい開発者は、これまで通りエディタのマクロなどで明示的に入力すれば引き続き利用できます(自動変換が無くなるだけで禁止されるわけではありません)。

議論のハイライト

  • @griesemer は「gofmtは空白の整形のみを担うべきで、他の自動的な書き換えをしたいなら別ツールを使うべき」と明言し、本提案を支持しました。
  • @dmitshur は既にacceptedだった #54312(go/doc側のルール見直し)との重複・競合を懸念しましたが、@seankhliao は「#54312は著者にとって挙動の予測が難しくなる複雑性を追加するだけで、エコシステムの大多数が望まない変換を残す実装困難な提案」と反論し、本提案の方がシンプルな改善であると主張しました。
  • @neild が提案委員会での議論をまとめ、「自動的なスマートクォート変換を積極的に支持する声はほとんど無く、逆に望まない声が多数を占める」との結論を提示。過去数年間gofmtが変換を適用してきたため既存の保守中コードには既にスマートクォートが含まれており、今回の変更が既存コードに与える影響は小さいとしています。
  • @magical・@cespare らのコメントでも「スマートクォート化を積極的に望むユーザーはごく少数(N=1程度)」との分析が示され、削除を後押ししました。
  • 結論として、go/docgo/formatの不整合を解消するにあたり、「go/formatgo/docに合わせてスマートクォートを挿入する」方向ではなく、「go/docgo/formatに合わせて挿入をやめる」方向で統一されました。

関連リンク