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

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

このコミットは、Go言語のbuiltinパッケージにおいて、truefalseという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言語の組み込み型であるtruefalseの定義を、src/pkg/builtin/builtin.goファイル内でより明確に文書化することです。元のコミットメッセージにあるFixes #5315は、おそらくGoのIssueトラッカーに登録されていた、truefalseのドキュメントが不足している、あるいは不明瞭であるという問題に対応するためのものです。

Go言語では、truefalseは単なるキーワードではなく、特定の型を持たない「型なし定数(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コンパイラは、型なし定数が使用される文脈に基づいて、適切な型を推論します。これにより、型なし定数は異なる型の変数に代入されたり、異なる型の演算子と共に使用されたりする際に、柔軟な型変換を可能にします。

truefalseは、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.
)

このコードは、truefalseがGo言語のコンパイラによってどのように扱われるかを示す、非常に興味深い実装の詳細を含んでいます。

  1. const宣言: truefalseが定数として定義されていることを示します。
  2. 0 == 00 != 0: これは、truefalseを定義するための巧妙な方法です。
    • 0 == 0は常に真(true)となる論理式です。
    • 0 != 0は常に偽(false)となる論理式です。 Goコンパイラは、これらの論理式の評価結果を、それぞれtruefalseという型なしの真偽値定数として扱います。これは、Go言語のコンパイラが定数式を評価する能力を利用したものです。
  3. // Untyped bool.コメント: このコメントは、truefalseが「型なしの真偽値」であることを明示的に示しています。これは、前述の「前提知識の解説」で述べた型なし定数の概念と直接関連しています。

この定義方法は、truefalseが単なるリテラル値としてではなく、コンパイラが評価できる定数式の結果として内部的に表現されていることを示唆しています。これにより、Go言語の型システムにおけるtruefalseの柔軟な振る舞いが保証されます。

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

--- 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.
    • この行は、追加される定数定義の目的を説明するコメントです。truefalseが「型なしの真偽値」であることを明確に述べています。これは、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パッケージにおけるtruefalseの内部的な定義とドキュメントを改善し、これらの値が型なし定数として機能する仕組みをコードレベルで明確にしています。

関連リンク

参考にした情報源リンク

  • コミットハッシュ: 8457afbe0050f4223e105cb4d1ad4938b8f12db7
  • Go言語の公式ドキュメント (上記「関連リンク」に記載)
  • Go言語のソースコード (src/pkg/builtin/builtin.go)
  • Go言語における型なし定数に関する一般的な知識