Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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,})において、末尾のカンマが必須とされています。これは、以下のような利点があるためです。

  1. 差分のクリーンさ: 新しい要素を追加する際に、既存の行を変更する必要がなく、新しい行を追加するだけで済むため、バージョン管理システムでの差分がより明確になります。
    // 末尾カンマがない場合
    - mySlice := []int{1, 2}
    + mySlice := []int{1, 2, 3} // 既存行の変更 + 新規行の追加
    
    // 末尾カンマがある場合
    - mySlice := []int{1, 2,}
    + mySlice := []int{1, 2, 3,} // 新規行の追加のみ
    
  2. 要素の並べ替えの容易さ: 要素の順序を変更する際に、カンマの追加や削除を気にする必要がありません。
  3. gofmtとの親和性: Go言語の公式フォーマッタであるgofmtは、この末尾のカンマの規則を自動的に適用し、コードの一貫性を保ちます。

EBNF (Extended Backus-Naur Form)

EBNFは、プログラミング言語の構文を記述するためのメタ言語です。このコミットでは、Go言語の仕様書内でEBNF形式で記述されたConversionの定義が変更されています。EBNFの記法では、[ ]はオプションの要素を示します。例えば、[ "," ]はカンマがオプションであることを意味します。

技術的詳細

このコミットは、Go言語の仕様書であるdoc/go_spec.htmlを修正しています。具体的な変更点は以下の通りです。

  1. 型変換のEBNF定義の変更: Conversionの構文定義が以下のように変更されました。

    • 変更前: Conversion = Type "(" Expression ")" .
    • 変更後: Conversion = Type "(" Expression [ "," ] ")" . この変更により、型変換の括弧()内のExpressionの後に、オプションで末尾のカンマ,を置くことが許可されるようになりました。例えば、MyType(someValue,)のような記述が可能になります。
  2. 変換に関する説明文の調整: 変換が許可される条件に関する説明文が、より簡潔で一貫性のある表現に修正されました。

    • xが整数、または[]byte[]runeのスライスであり、Tが文字列型である場合。
      • 変更前: x is an integer or has type []byte or []rune and T is a string type.
      • 変更後: x is an integer or a slice of bytes or runes and T is a string type.
    • xが文字列であり、T[]byteまたは[]runeである場合。
      • 変更前: x is a string and T is []byte or []rune.
      • 変更後: x is a string and T is a slice of bytes or runes. これらの変更は、意味的な変更ではなく、表現の簡潔化と整合性の向上を目的としています。
  3. 仕様書の日付更新: 仕様書のバージョン日付が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言語の公式な振る舞いが明確化され、将来の言語機能の拡張やツールの開発に影響を与えます。

関連リンク

参考にした情報源リンク