Go/Predeclared identifiers
GoにおけるPredeclared identifiers(事前宣言された識別子)とは、プログラムのどこでも明示的に宣言することなく使用できる組み込みの識別子のことです。これらはGo言語仕様によってあらかじめ定義されており、特別な意味を持ちます。
Predeclared identifiersは、大きく以下のカテゴリに分けられます。
1. 型 (Types):
[編集]Goの仕様においては、「組み込み型 (built-in types)」という表現よりも「事前宣言された型 (predeclared types)」という表現の方が厳密で、Go言語の公式仕様(The Go Programming Language Specification)でもこの用語が使われています。
たとえば、以下のような型はすべて「事前宣言された型」として扱われます:
- 整数型:
int,int8,int16,int32,int64,uint,uintptr, など - 浮動小数点型:
float32,float64 - 複素数型:
complex64,complex128 - 文字型:
rune(実体はint32) - 文字列型:
string - ブール型:
bool - その他:
byte(実体はuint8)、error(インターフェース型),any(実体はinterface{}; Go 1.18以降)
これらは、どのパッケージからも修飾なしで直接使えるため、「組み込み」のように感じられますが、仕様としては「事前に宣言されているだけで、他の型と同様に型システムの中で扱われる型」です。
- 参考箇所(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)
4. 関数 (Functions):
[編集]事前宣言された関数 (predeclared functions)
| 名称 | 機能 | 用例 |
|---|---|---|
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言語の簡潔さと開発の効率性を高めるのに役立っています。