コンテンツにスキップ

Go/Predeclared identifiers

出典: フリー教科書『ウィキブックス(Wikibooks)』
< Go

GoにおけるPredeclared identifiers(事前宣言された識別子)とは、プログラムのどこでも明示的に宣言することなく使用できる組み込みの識別子のことです。これらはGo言語仕様によってあらかじめ定義されており、特別な意味を持ちます。

Predeclared identifiersは、大きく以下のカテゴリに分けられます。

1. 型 (Types):

[編集]

Goの仕様においては、「組み込み型 (built-in types)」という表現よりも「事前宣言された型 (predeclared types)」という表現の方が厳密で、Go言語の公式仕様(The Go Programming Language Specification)でもこの用語が使われています。

たとえば、以下のような型はすべて「事前宣言された型」として扱われます:

これらは、どのパッケージからも修飾なしで直接使えるため、「組み込み」のように感じられますが、仕様としては「事前に宣言されているだけで、他の型と同様に型システムの中で扱われる型」です。

参考箇所(Go仕様書より):
"The predeclared types are: bool, byte, complex64, complex128, error, float32, float64, int, int8, int16, int32, int64, rune, string, uint, uint8, uint16, uint32, uint64, uintptr"

2. 型制約 (Type constraint):

[編集]

事前宣言された型制約 (predeclared type constraint)

  • 比較可能な型の制約 (ジェネリクス): comparable (Go 1.18以降)

3. 定数 (Constants):

[編集]

事前宣言された定数 (predeclared constants)

  • 真偽値: true, false
  • nil: ポインタ、スライス、マップ、チャネル、関数、インターフェースのゼロ値(Zero value)
  • iota: 定数宣言のカウンタ

4. 関数 (Functions):

[編集]

事前宣言された関数 (predeclared functions)

Goの事前宣言された関数一覧
名称 機能 用例
append スライスに要素を追加する s := append([]int{1, 2}, 3)
cap スライス、配列、チャネルの容量を返す c := cap([]int{1, 2, 3})
clear マップまたはスライスのすべての要素を削除(Go 1.21以降) clear(m) / clear(s)
close チャネルを閉じる close(ch)
complex 実部と虚部から複素数を作る z := complex(1, 2)
copy スライスの内容をコピーする copy(dst, src)
delete マップから要素を削除する delete(m, "key")
imag 複素数の虚部を取得する y := imag(3 + 4i)
len 配列、スライス、マップ、文字列、チャネルの長さを返す n := len("hello")
make スライス、マップ、チャネルを生成する(初期化) s := make([]int, 10)
max 引数の中で最大値を返す(Go 1.21以降) x := max(1, 3, 2)
min 引数の中で最小値を返す(Go 1.21以降) y := min(1, 3, 2)
new 型に基づいてメモリを割り当ててポインタを返す p := new(int)
panic ランタイムエラーを発生させる(例外処理) panic("error!")
print デバッグ用に標準出力へ出力(推奨されない) print("hello")
println デバッグ用に改行付きで標準出力へ出力(推奨されない) println("hello")
real 複素数の実部を取得する x := real(3 + 4i)
recover panic を捕捉してプログラムを回復する v := recover()

これらの事前宣言された識別子は、Goプログラム内で特別な宣言なしに直接利用できます。例えば、整数の変数を宣言する際に var i int と書く場合、int は事前宣言された型識別子です。同様に、スライスに要素を追加する際には append(slice, element) のように、append という事前宣言された関数識別子を直接使用します。

キーワードとの違い:

[編集]

Predeclared identifiersは、if, for, func などのキーワードとは異なります。キーワードは言語の構文を構成する上で予約されており、識別子として使用することはできません。一方、predeclared identifiersは、必要であればユーザーが同じ名前の識別子を別のスコープで宣言することで、一時的に「影に隠す」(shadowing)ことができますが、これは一般的には推奨されません。

例:

[編集]
package main

import "fmt"

func main() {
	var count int = 10       // int は事前宣言された型
	isValid := true          // bool は事前宣言された型
	message := "Hello"      // string は事前宣言された型

	slice := make([]int, 0, 5) // make は事前宣言された関数
	slice = append(slice, 1)   // append は事前宣言された関数
	length := len(slice)      // len は事前宣言された関数

	fmt.Println(count, isValid, message, length)
}

スコープ

[編集]

Predeclared identifiersは、ユニバースブロック(universe block)で宣言されており、すべてのGoコードで利用可能です。

このように、Goのプログラムでは、多くの基本的な型や関数が事前宣言されているため、すぐに利用することができます。これは、Go言語の簡潔さと開発の効率性を高めるのに役立っています。