[インデックス 13961] ファイルの概要
このコミットは、Go言語の仕様書(doc/go_spec.html
)に対する変更であり、型変換(Conversions)の構文において末尾のカンマ(trailing comma)を許可するように修正しています。また、変換に関する説明文の整合性も調整されています。この変更は後方互換性のある構文変更であり、Go言語の自動セミコロン挿入規則と関連する慣習に沿ったものです。
コミット
- コミットハッシュ:
60a6ae8c3c278c3e0fcb832f2e5c085825d867cc
- Author: Robert Griesemer gri@golang.org
- Date: Wed Sep 26 10:31:57 2012 -0700
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/60a6ae8c3c278c3e0fcb832f2e5c085825d867cc
元コミット内容
spec: permit trailing comma in conversions
Also: Adjust prose in Conversions section
to be consistent.
This is a backward-compatible syntax change.
For a discussion see issue 2568.
Fixes #2568.
Fixes #4123.
R=golang-dev, r, iant, rsc
CC=golang-dev
https://golang.org/cl/6572049
変更の背景
この変更の主な背景には、Go言語の構文における一貫性の向上と、開発者の利便性の向上が挙げられます。特に、Go言語では複合リテラル(構造体、配列、スライスなど)において、複数行にわたる場合に最後の要素の後に末尾のカンマを置くことが推奨されており、gofmt
によって自動的に整形されます。これは、バージョン管理システムでの差分(diff)をクリーンに保ち、要素の追加や並べ替えを容易にするという利点があります。
コミットメッセージで言及されているissue 2568
は、この末尾のカンマの許可に関する議論が行われた場所です。型変換の構文においても、同様の利点(特に複数行にわたる複雑な変換式の場合)を享受できるように、末尾のカンマを許可するよう仕様が変更されました。これにより、Go言語全体の構文規則がより一貫したものとなり、開発者がコードを記述する際の予測可能性と整形ツール(gofmt
)との親和性が向上します。issue 4123
も関連する問題として修正されています。
前提知識の解説
Go言語の型変換 (Conversions)
Go言語における型変換は、ある型の値を別の型に明示的に変換する操作です。これは、T(x)
という形式で記述され、T
は変換先の型、x
は変換される式です。例えば、int(3.14)
は浮動小数点数3.14
を整数型に変換します。型変換は、異なる型の間の互換性がない場合に、値を特定の型として扱いたいときに使用されます。
末尾のカンマ (Trailing Comma)
プログラミング言語における末尾のカンマとは、リスト、配列、構造体、関数引数などの要素の最後に置かれる追加のカンマのことです。多くの言語では、これは構文エラーとはならず、むしろ推奨されるスタイルとなることがあります。
Go言語では、特に複数行にわたる複合リテラル(例: []int{1, 2, 3,}
)において、末尾のカンマが必須とされています。これは、以下のような利点があるためです。
- 差分のクリーンさ: 新しい要素を追加する際に、既存の行を変更する必要がなく、新しい行を追加するだけで済むため、バージョン管理システムでの差分がより明確になります。
// 末尾カンマがない場合 - mySlice := []int{1, 2} + mySlice := []int{1, 2, 3} // 既存行の変更 + 新規行の追加 // 末尾カンマがある場合 - mySlice := []int{1, 2,} + mySlice := []int{1, 2, 3,} // 新規行の追加のみ
- 要素の並べ替えの容易さ: 要素の順序を変更する際に、カンマの追加や削除を気にする必要がありません。
gofmt
との親和性: Go言語の公式フォーマッタであるgofmt
は、この末尾のカンマの規則を自動的に適用し、コードの一貫性を保ちます。
EBNF (Extended Backus-Naur Form)
EBNFは、プログラミング言語の構文を記述するためのメタ言語です。このコミットでは、Go言語の仕様書内でEBNF形式で記述されたConversion
の定義が変更されています。EBNFの記法では、[ ]
はオプションの要素を示します。例えば、[ "," ]
はカンマがオプションであることを意味します。
技術的詳細
このコミットは、Go言語の仕様書であるdoc/go_spec.html
を修正しています。具体的な変更点は以下の通りです。
-
型変換のEBNF定義の変更:
Conversion
の構文定義が以下のように変更されました。- 変更前:
Conversion = Type "(" Expression ")" .
- 変更後:
Conversion = Type "(" Expression [ "," ] ")" .
この変更により、型変換の括弧()
内のExpression
の後に、オプションで末尾のカンマ,
を置くことが許可されるようになりました。例えば、MyType(someValue,)
のような記述が可能になります。
- 変更前:
-
変換に関する説明文の調整: 変換が許可される条件に関する説明文が、より簡潔で一貫性のある表現に修正されました。
x
が整数、または[]byte
、[]rune
のスライスであり、T
が文字列型である場合。- 変更前:
x
is an integer or has type[]byte
or[]rune
andT
is a string type. - 変更後:
x
is an integer or a slice of bytes or runes andT
is a string type.
- 変更前:
x
が文字列であり、T
が[]byte
または[]rune
である場合。- 変更前:
x
is a string andT
is[]byte
or[]rune
. - 変更後:
x
is a string andT
is a slice of bytes or runes. これらの変更は、意味的な変更ではなく、表現の簡潔化と整合性の向上を目的としています。
- 変更前:
-
仕様書の日付更新: 仕様書のバージョン日付が
September 22, 2012
からSeptember 26, 2012
に更新されています。
この変更は、Go言語のパーサーが型変換の構文を解析する際に、末尾のカンマを許容するように更新されることを意味します。これにより、開発者は型変換の記述において、複合リテラルと同様の末尾カンマの慣習を適用できるようになり、コードの整形や保守が容易になります。
コアとなるコードの変更箇所
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,6 +1,6 @@
<!--{
"Title": "The Go Programming Language Specification",
- "Subtitle": "Version of September 22, 2012",
+ "Subtitle": "Version of September 26, 2012",
"Path": "/ref/spec"
}-->
@@ -3390,7 +3390,7 @@ that can be converted to type <code>T</code>.
</p>
<pre class="ebnf">
-Conversion = Type "(" Expression ")" .
+Conversion = Type "(" Expression [ "," ] ")" .
</pre>
<p>
@@ -3464,12 +3464,11 @@ in any of these cases:\n <code>x</code>'s type and <code>T</code> are both complex types.\n </li>\n <li>\n-\t<code>x</code> is an integer or has type <code>[]byte</code> or\n-\t<code>[]rune</code> and <code>T</code> is a string type.\n+\t<code>x</code> is an integer or a slice of bytes or runes\n+\tand <code>T</code> is a string type.\n \t</li>\n <li>\n-\t<code>x</code> is a string and <code>T</code> is <code>[]byte</code> or\n-\t<code>[]rune</code>.\n+\t<code>x</code> is a string and <code>T</code> is a slice of bytes or runes.\n \t</li>\n </ul>
コアとなるコードの解説
変更されたファイルはdoc/go_spec.html
であり、これはGo言語の公式仕様書をHTML形式で記述したものです。このファイルは、Go言語の構文、セマンティクス、組み込み関数などを定義しており、Goコンパイラやツールの実装の基礎となります。
最も重要な変更は、EBNF形式で記述されたConversion
の定義行です。
Conversion = Type "(" Expression [ "," ] ")" .
この行は、Go言語の型変換の構文規則を定めています。[ "," ]
が追加されたことで、Type(Expression)
の形式に加えて、Type(Expression,)
のように、変換される式(Expression
)の後にオプションでカンマを置くことが許可されるようになりました。これは、Go言語のパーサーがこの新しい構文を正しく解釈し、有効なコードとして認識するように変更されることを意味します。
また、その下の説明文の変更は、仕様書自体の可読性と正確性を向上させるためのものです。例えば、「[]byte
または[]rune
の型を持つ」という表現が「バイトまたはルーンのスライス」というより一般的な表現に修正されており、より自然な英語表現になっています。
これらの変更は、Go言語の構文解析器やgofmt
のようなツールが、新しい構文規則に準拠するように更新されることを前提としています。仕様書が更新されることで、Go言語の公式な振る舞いが明確化され、将来の言語機能の拡張やツールの開発に影響を与えます。
関連リンク
- Go Issue 2568: https://github.com/golang/go/issues/2568
- Go Issue 4123: https://github.com/golang/go/issues/4123
- Gerrit Change 6572049: https://golang.org/cl/6572049
参考にした情報源リンク
- Go言語における末尾のカンマに関する議論:
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQFSEITqq4AdzmT_I6UNxRU-TgQUAoS875USHltIYaaw24Ow2hyHRhkpyjrQdnm0l4imEtOsml7IyaiCa5xCXN342YlZuoa1wD5pbaRVIp4GD9X0zOyE2HkFLuYeXi3f4Nvhz0eYQ7qO1K-LZROaM0CT
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGgz2zOgZeO1o0SBh5LvcREGV5Y6XWEgE7dd3o6Qc2gUJOMEpsKaMbdCJIBxe5kZbmxG2AgcGxOsltTyVOdf8IOhKct33zk7ALsfVYSZvOuyaieMA_5zIOtCV5uGmUxeGPM8aBf-ZuD7uMKckOwWZsG6z9vVp6z33KtOcISQtej03_o7d7i0tAzb6ATQZaZPnfQ21XPp5S-1wgl
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHkLbqvBafCYgvc7C-v8dYX-IrnmWkbq3YzGnNO94n-Z1oDkSOkM_SMmZ8qgrGJR1gggOIGnH9wuULktpevNaQY9bTk_bd8gUyoaHUlVgNZtoLoUo5ma7lJWsSmIVKdK-0vtdk=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQG-0FzK5xRph0HKzN5f75A2XUbXu32ZVdFA7mnXtJ53_N9bZadE8a9uA4l-ejEkM3nhepLV1cuqxav_-uzgyln4L9R4TiOrJdwtb9ZBzLySG04yAOEaB1WYauwxmJL638SM4gMZu3ie3OYr9OJYV2ksm5vQONAhma9jbm8tUnpQImZDyTH4suo2AhoGM56wW1eGR4lkDP1PxsWx8sXFcb3ETpjUcQ==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHSe-w5UlnDg6dwVDb4uIPE6riC0fUqu6iJ-s2g2NvKIHZlsDvwnQxgS8dbVCcQioc5D82tf5ePc6u3T9SbBh9nI0Mka8rnWkqvEpWBNd1sXU9i15NRyswa9_Ub--u2U2SZ_9iKFVWv0cvwHZALrVN0Et5NK9Vh44DOZfId3Y56Z61GccflE5Tzy8N7QxiJ2HkI8ZxpK-C84x35VHQ_bFbaLHjf7g==