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

[インデックス 18283] ファイルの概要

このコミットは、Go言語の公式ドキュメントである「Effective Go」において、識別子の可視性に関する記述を修正するものです。「private」という用語を「unexported」に置き換えることで、Go言語における正確な概念を反映させ、読者の誤解を防ぐことを目的としています。

コミット

commit 1e67453d93c317d5a30780cc54a53c9d19373fdf
Author: David Symonds <dsymonds@golang.org>
Date:   Fri Jan 17 09:06:39 2014 -0800

    doc: replace "private" with "unexported" in Effective Go.
    
    R=r
    CC=golang-codereviews
    https://golang.org/cl/53720043

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/1e67453d93c317d5a30780cc54a53c9d19373fdf

元コミット内容

doc: replace "private" with "unexported" in Effective Go.

R=r
CC=golang-codereviews
https://golang.org/cl/53720043

変更の背景

Go言語では、識別子(変数、関数、型、構造体フィールド、メソッドなど)の可視性を制御するために、その名前の先頭文字の大小を区別するという独特のルールを採用しています。具体的には、先頭が大文字の識別子は「エクスポート(exported)」され、パッケージの外部からアクセス可能になります。一方、先頭が小文字の識別子は「アンエクスポート(unexported)」され、その識別子が宣言されたパッケージ内でのみアクセス可能です。

しかし、他の多くのプログラミング言語(Java, C++, Pythonなど)では、クラスやオブジェクト指向の文脈で「public」「private」「protected」といった明示的なキーワードを用いて可視性を制御します。特に「private」は、その要素が宣言されたクラスやスコープ内でのみアクセス可能であることを意味します。

Go言語の初期のドキュメントやコミュニティでは、この「unexported」な識別子を、他の言語の「private」という概念と類似していることから、便宜的に「private」と呼ぶことがありました。しかし、これは厳密には正確ではありません。Go言語にはクラスという概念がなく、可視性のスコープはパッケージレベルであるため、「private」という用語は誤解を招く可能性がありました。

このコミットは、このような用語の不一致とそれに伴う誤解を解消するために、「Effective Go」ドキュメント内で使用されていた「private」という用語を、Go言語の仕様に則した正確な「unexported」という用語に置き換えることを目的としています。これにより、Go言語の可視性ルールに関する理解を深め、より正確な情報を提供することが意図されています。

前提知識の解説

このコミットの理解には、Go言語における識別子の可視性(エクスポートとアンエクスポート)に関する知識が不可欠です。

Go言語における識別子の可視性ルール:

Go言語には、他の多くのオブジェクト指向言語に見られるような publicprivate といった明示的なアクセス修飾子はありません。その代わりに、識別子の名前付け規則によって可視性が決定されます。

  1. エクスポートされた識別子 (Exported Identifiers):

    • 識別子の名前が大文字のUnicode文字で始まる場合、その識別子はエクスポートされます。
    • エクスポートされた識別子は、それが宣言されたパッケージの外部から、そのパッケージをインポートすることでアクセス可能です。
    • 例: fmt.Println, math.Pi, MyStruct, MyFunction
  2. アンエクスポートされた識別子 (Unexported Identifiers):

    • 識別子の名前が小文字のUnicode文字で始まる場合、その識別子はアンエクスポートされます。
    • アンエクスポートされた識別子は、それが宣言されたパッケージ内でのみアクセス可能です。パッケージの外部からはアクセスできません。
    • 例: myVariable, calculateSum, internalHelper

「private」と「unexported」の違い:

  • Private (他の言語の概念): 通常、クラスやオブジェクトのメンバーに対して使用され、そのクラスのインスタンス内でのみアクセス可能であることを意味します。スコープはクラスやインスタンスレベルです。
  • Unexported (Go言語の概念): Go言語では、可視性の最小単位はパッケージです。アンエクスポートされた識別子は、その識別子が定義されたパッケージ内のどのファイルからでもアクセスできますが、パッケージの外部からはアクセスできません。つまり、Goにおける「unexported」は、他の言語の「private」が持つ「クラス内でのみ」という厳密なスコープではなく、「パッケージ内でのみ」というより広いスコープを持ちます。

この違いから、「private」という用語はGo言語の可視性モデルを正確に表現していないため、「unexported」という用語が推奨されます。このコミットは、この推奨される用語法を公式ドキュメントに適用するものです。

技術的詳細

このコミットは、Go言語の公式ドキュメントである「Effective Go」のHTMLソースコード (doc/effective_go.html) 内の記述を修正するものです。具体的な変更は、テキストの置換であり、Goコンパイラやランタイムの動作に直接的な影響を与えるものではありません。しかし、Go言語の設計思想とベストプラクティスを正確に伝える上で非常に重要な意味を持ちます。

Go言語の設計哲学の一つに「シンプルさ」と「明示性」があります。識別子の可視性を名前付け規則に委ねることで、複雑なアクセス修飾子を導入することなく、コードの意図を明確にしています。このアプローチは、Goのコードベースを読みやすく、理解しやすくすることに貢献しています。

「private」という用語の使用は、Go言語の可視性モデルを、他の言語のオブジェクト指向パラダイムに無理に当てはめようとする傾向を示していました。しかし、Goは純粋なオブジェクト指向言語ではなく、独自のモジュール化とカプセル化のメカニズムを持っています。このコミットは、Go言語が持つ独自の特性を尊重し、その用語法を統一することで、Goプログラマーが言語の設計意図をより深く理解できるように促します。

また、ドキュメントの正確性は、言語の学習曲線やコミュニティ全体の理解度に大きな影響を与えます。特に「Effective Go」のような、Goプログラミングのベストプラクティスを解説する重要なドキュメントにおいては、用語の厳密な使用が求められます。この修正は、Go言語の公式な用語法を確立し、将来のドキュメントや議論における混乱を避けるための基盤となります。

コアとなるコードの変更箇所

変更は doc/effective_go.html ファイルの1箇所のみです。

--- a/doc/effective_go.html
+++ b/doc/effective_go.html
@@ -288,7 +288,7 @@ var (
 </pre>
 
 <p>
--Even for private names, grouping can also indicate relationships between items,
++Grouping can also indicate relationships between items,
 such as the fact that a set of variables is protected by a mutex.
 </p>
 

コアとなるコードの解説

変更された行は、doc/effective_go.html 内の以下の段落です。

変更前: -Even for private names, grouping can also indicate relationships between items,

変更後: +Grouping can also indicate relationships between items,

この変更は、元の文にあった「Even for private names,」という部分を削除し、より一般的な表現に修正しています。これは、Go言語において「private names」という表現が不正確であるため、その部分を削除することで、アンエクスポートされた識別子だけでなく、エクスポートされた識別子を含むすべての識別子に対して「グルーピングがアイテム間の関係性を示す」という文脈を適用できるようにしています。

具体的には、Go言語では、識別子の可視性(エクスポートされているかアンエクスポートされているか)に関わらず、関連する変数や定数をグループ化することで、コードの意図や構造を明確にすることができます。例えば、ミューテックスによって保護される一連の変数をグループ化する際に、それらの変数がアンエクスポートされているかどうかにかかわらず、そのグルーピング自体が関係性を示すという文脈は変わりません。

この修正により、ドキュメントはGo言語の命名規則と可視性に関するより正確で包括的な説明を提供し、読者がGoの設計原則をより深く理解するのに役立ちます。

関連リンク

参考にした情報源リンク