cmd/gofmt: don't rewrite into smart quotes
要約
概要
gofmtが二重引用符 '' などを自動的に「スマートクオート」(” のような曲線的な引用符)へ書き換えてしまう挙動を廃止する提案です。合わせて go/doc によるドキュメント表示時の同様の自動変換も廃止し、ソースコードの見た目をユーザーの入力どおりに保つことを目指します。
ステータス変更
active → likely_accept
2026-07-08のproposal review meetingにて、既存の議論(特に@neildによるサマリー: 「二重引用符の自動置換を支持する声はほとんどなく、望まない人が多い」)が引き続き有効であるとされ、likely acceptと判断されました。@aclementsは、この書き換えをgofmtに導入した本来の目的が「go/docが行っていた変換を可視化すること」だったため、gofmtでの書き換えをやめるならgo/doc側の変換もやめるべきという結論に至ったことを明言しています。
技術的背景
現状の問題点
現行のgofmtは、コメント中の `` (バッククォート2つ) や '' (シングルクォート2つ) を、左右非対称な「スマートクオート」文字(例: “、”)へ自動的に書き換えます。この挙動は#51082でgofmtに導入されましたが、以下のような問題が報告されました。
- キーボードから直接入力できない文字がソースコードに混入する。
- コメント中のコード例(例えば生文字列リテラルの区切り記号
`)がスマートクオートに置換されると、そのコード例自体が無効になる。 - 数学的な文脈で
'(プライム記号)や''(二重プライム)として意図的に使われている箇所まで意味的に変わってしまう(#54312で指摘)。 - 文字列検索(
grepなど)で元の文字列がヒットしなくなる。
% 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/format(およびそれを利用するgofmt、go fmt)とgo/doc(およびそれを利用するgo doc、pkg.go.dev)の両方から、引用符の自動書き換えロジックを削除します。これにより、ソースコード中の引用符はユーザーが入力した文字のまま保持されるようになります。実装としては既に go.dev/cl/732420(go/doc/comment: never rewrite into smart quotes)がgopherbotによって関連付けられています。
本提案は、以前accepted済みだったものの未実装だった#54312(go/docでの''書き換えの見直し)を包含・代替するものです。#54312は「一部のケースでは書き換えを維持しつつ複雑なルールで判定する」アプローチでしたが、実装の複雑さと、そもそも変換自体を望む声が少ないことから、今回は「一切書き換えない」というよりシンプルな方向で決着しました。
これによって何ができるようになるか
開発者はコメントやドキュメント中の引用符表記を完全に自分でコントロールできるようになります。特に以下のようなケースで有用です。
- 生文字列リテラルの区切り記号
`をコメント内のコード例で安全に使える。 - 数学・物理系のコードで
'(プライム)や''(二重プライム)を意味通りに保持できる。 - コメント内の文字列を
grepなどでそのまま検索できる。
コード例
// Before: gofmt/go docが自動的にスマートクオートへ書き換える
// Raw quotes are Go-like and bounded by ``.
// f'' denotes the second derivative.
// gofmt実行後(意図せず変わってしまう)
// Raw quotes are Go-like and bounded by ".
// f” denotes the second derivative.
// After: 提案適用後は入力したままの文字が保持される
// Raw quotes are Go-like and bounded by ``.
// f'' denotes the second derivative.
議論のハイライト
- @griesemer は「gofmtは本来ホワイトスペースの整形のみを担うべきで、意味を変える書き換えはすべきでない」と一貫して支持。
- #54312との重複・競合が最大の論点となった。@dmitshur は「#54312は既にエコシステム分析を経てacceptされているのに、この提案にはそれがない」と懸念を表明したが、@seankhliao や @neild は「#54312の複雑な部分的書き換えルールは実装コストが高く、それを望む支持者もごく少数」と反論。
- @magical の指摘: 過去数年間の
gofmt適用によって既存コードはすでにスマートクオート化されているため、書き換えを止めても既存コードへの影響は小さく、スマートクオートを使いたい人は今後も手動で入力すればよい。 - @neild による総括的コメントが議論の着地点となり、「自動変換を支持する声はほぼゼロ、望まない声は多数」という認識で proposal review group の合意が形成された。
- @aclements は、当初
gofmtにスマートクオート変換が導入された目的が「go/docの変換を可視化するため」だったことを踏まえ、gofmtの変換をやめるならgo/doc側も揃えて廃止すべきと結論づけ、スコープをgo/formatとgo/docの両方に拡大した。
関連リンク
- Proposal Issue github.com/golang/go
- Review Comment proposal review meeting
- Proposal Issue #76975
- Review Minutes
- 関連Issue #54312: go/doc: reconsider comment rewrites of `''` to `”`(本提案に包含される形で解消)
- 関連Issue #51082: 元々スマートクオート変換を導入した提案
- 関連Issue #61365: cmd/gofmt: smart quotes are not(closed)
- 関連Issue #56380: go/format: unable to write '' in a comment(closed)