[インデックス 16198] ファイルの概要
このコミットは、Go言語のbuiltin
パッケージにおいて、true
とfalse
という2つの組み込みの真偽値(boolean values)に関するドキュメントを追加するものです。具体的には、これらの値が「型なしの真偽値(untyped boolean values)」としてどのように定義されているかを明示しています。
コミット
- コミットハッシュ:
8457afbe0050f4223e105cb4d1ad4938b8f12db7
- Author: Robert Griesemer gri@golang.org
- Date: Thu Apr 18 14:36:08 2013 -0700
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/8457afbe0050f4223e105cb4d1ad4938b8f12db7
元コミット内容
builtin: document true and false.
Fixes #5315.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/8841048
変更の背景
このコミットの主な目的は、Go言語の組み込み型であるtrue
とfalse
の定義を、src/pkg/builtin/builtin.go
ファイル内でより明確に文書化することです。元のコミットメッセージにあるFixes #5315
は、おそらくGoのIssueトラッカーに登録されていた、true
とfalse
のドキュメントが不足している、あるいは不明瞭であるという問題に対応するためのものです。
Go言語では、true
とfalse
は単なるキーワードではなく、特定の型を持たない「型なし定数(untyped constants)」として扱われます。これにより、これらの値は必要に応じて様々な真偽値型に暗黙的に変換される柔軟性を持っています。このコミットは、その重要な特性をコードベース自体に明示的に記述することで、Go言語の設計思想と実装の透明性を高めることを意図しています。
前提知識の解説
builtin
パッケージ
Go言語のbuiltin
パッケージは、Goプログラムのコンパイル時に自動的にインポートされる特別なパッケージです。このパッケージには、int
, bool
, string
などの基本的な組み込み型、make
, new
, len
, cap
, panic
, recover
などの組み込み関数、そしてtrue
, false
, nil
, iota
などの組み込み定数が定義されています。これらの要素は、Go言語の基本的な構成要素であり、明示的なインポートなしにどのGoプログラムからでも利用できます。
型なし定数(Untyped Constants)
Go言語における定数には、「型付き定数(typed constants)」と「型なし定数(untyped constants)」の2種類があります。
- 型付き定数: 明示的に型が指定された定数です。例:
const MyInt int = 10
- 型なし定数: 型が指定されていない定数です。Goコンパイラは、型なし定数が使用される文脈に基づいて、適切な型を推論します。これにより、型なし定数は異なる型の変数に代入されたり、異なる型の演算子と共に使用されたりする際に、柔軟な型変換を可能にします。
true
とfalse
は、Go言語において型なしの真偽値定数として扱われます。これは、例えばvar b bool = true
のように、bool
型の変数に直接代入できるだけでなく、if true { ... }
のように、型を明示せずに条件式として使用できる理由でもあります。
技術的詳細
このコミットでは、src/pkg/builtin/builtin.go
ファイルに以下のコードが追加されています。
// true and false are the two untyped boolean values.
const (
true = 0 == 0 // Untyped bool.
false = 0 != 0 // Untyped bool.
)
このコードは、true
とfalse
がGo言語のコンパイラによってどのように扱われるかを示す、非常に興味深い実装の詳細を含んでいます。
const
宣言:true
とfalse
が定数として定義されていることを示します。0 == 0
と0 != 0
: これは、true
とfalse
を定義するための巧妙な方法です。0 == 0
は常に真(true)となる論理式です。0 != 0
は常に偽(false)となる論理式です。 Goコンパイラは、これらの論理式の評価結果を、それぞれtrue
とfalse
という型なしの真偽値定数として扱います。これは、Go言語のコンパイラが定数式を評価する能力を利用したものです。
// Untyped bool.
コメント: このコメントは、true
とfalse
が「型なしの真偽値」であることを明示的に示しています。これは、前述の「前提知識の解説」で述べた型なし定数の概念と直接関連しています。
この定義方法は、true
とfalse
が単なるリテラル値としてではなく、コンパイラが評価できる定数式の結果として内部的に表現されていることを示唆しています。これにより、Go言語の型システムにおけるtrue
とfalse
の柔軟な振る舞いが保証されます。
コアとなるコードの変更箇所
--- a/src/pkg/builtin/builtin.go
+++ b/src/pkg/builtin/builtin.go
@@ -13,6 +13,12 @@ package builtin
// bool is the set of boolean values, true and false.
type bool bool
+// true and false are the two untyped boolean values.
+const (
+ true = 0 == 0 // Untyped bool.
+ false = 0 != 0 // Untyped bool.
+)
+
// uint8 is the set of all unsigned 8-bit integers.
// Range: 0 through 255.
type uint8 uint8
コアとなるコードの解説
上記の差分は、src/pkg/builtin/builtin.go
ファイルに6行が追加されたことを示しています。
// true and false are the two untyped boolean values.
- この行は、追加される定数定義の目的を説明するコメントです。
true
とfalse
が「型なしの真偽値」であることを明確に述べています。これは、Go言語の設計においてこれらの値がどのように扱われるかという重要な側面を強調しています。
- この行は、追加される定数定義の目的を説明するコメントです。
const (
- 定数ブロックの開始を示します。Goでは、複数の定数をまとめて宣言する際にこの形式がよく用いられます。
true = 0 == 0 // Untyped bool.
true
定数の定義です。0 == 0
という常に真となる式を用いてtrue
を定義しています。これにより、true
がコンパイラによって評価される定数式の結果として扱われることが示されます。コメント// Untyped bool.
は、この定数が型を持たないことを再度強調しています。
false = 0 != 0 // Untyped bool.
false
定数の定義です。0 != 0
という常に偽となる式を用いてfalse
を定義しています。同様に、false
もコンパイラによって評価される定数式の結果として扱われ、型を持たないことがコメントで示されています。
)
- 定数ブロックの終了を示します。
これらの変更は、Go言語のbuiltin
パッケージにおけるtrue
とfalse
の内部的な定義とドキュメントを改善し、これらの値が型なし定数として機能する仕組みをコードレベルで明確にしています。
関連リンク
- Go言語の組み込み型に関する公式ドキュメント: https://go.dev/ref/spec#Boolean_types
- Go言語の定数に関する公式ドキュメント: https://go.dev/ref/spec#Constants
参考にした情報源リンク
- コミットハッシュ:
8457afbe0050f4223e105cb4d1ad4938b8f12db7
- Go言語の公式ドキュメント (上記「関連リンク」に記載)
- Go言語のソースコード (
src/pkg/builtin/builtin.go
) - Go言語における型なし定数に関する一般的な知識