
こんにちは。よっしーです(^^)
本日は、Go言語の言語仕様について解説しています。
背景
Go言語を学び始めて、公式の「The Go Programming Language Specification(言語仕様書)」を開いてみたものの、「英語で書かれていて読むのが大変…」「専門用語ばかりで何を言っているのかわからない…」と感じたことはありませんか? 実は、多くのGo初心者が同じ壁にぶつかっています。
言語仕様書は、Go言語の「正式な取扱説明書」のような存在です。プログラミング言語がどのように動くのか、どんなルールで書くべきなのかが詳しく書かれていますが、その分、初めて読む人には難しく感じられるのも事実です。
そこでこの記事では、言語仕様書の導入部分を丁寧な日本語訳とともに、初心者の方でも理解しやすい補足説明を加えてお届けします。「強く型付けされている」「ガベージコレクション」「並行プログラミング」といった専門用語も、具体例を交えながらわかりやすく解説していきます。
言語仕様書は難しそうに見えますが、一つひとつの概念を丁寧に読み解いていけば、必ず理解できます。一緒に、Go言語の基礎をしっかり学んでいきましょう!
組み込み関数(Built-in functions)
組み込み関数は事前宣言されている。他の関数と同様に呼び出されるが、一部は最初の引数として式ではなく型を受け付ける。
組み込み関数は標準の Go の型を持たないため、呼び出し式にのみ現れることができる。関数値として使用することはできない。
解説
組み込み関数ってなに?
組み込み関数は、Go に最初から用意されている特別な関数です。import なしでどこでも使えます。
len("hello") // 5
make([]int, 10) // 長さ10のスライスを作成
append(s, 1, 2, 3) // スライスに要素を追加
普通の関数との違い
組み込み関数には、ユーザーが定義する関数にはない特別な性質が2つあります。
1. 引数に「型」を取れるものがある
make([]int, 10) // 第1引数は []int という「型」
new(Point) // 引数は Point という「型」
普通の関数は値しか引数に取れませんが、make や new は型そのものを引数として受け取ります。これは Go の通常の型システムでは表現できない特別な機能です。
2. 関数値として扱えない
f := len // コンパイルエラー! len を変数に代入できない
f := fmt.Println // OK! 普通の関数は変数に代入できる
組み込み関数は「標準の Go の型を持たない」ので、変数に代入したり、他の関数に引数として渡したりできません。呼び出す以外の使い方はできないということです。
// 普通の関数なら渡せる
apply(fmt.Println, "hello")
// 組み込み関数は渡せない
// apply(len, "hello") // コンパイルエラー!
// ラッパーを作れば回避できる
myLen := func(s string) int { return len(s) }
apply(myLen, "hello") // OK
組み込み関数の一覧
Go の組み込み関数は以下のとおりです。後続の節でそれぞれ詳しく説明されます。
// サイズ・容量の取得
len(v) // 長さ
cap(v) // 容量
// コレクションの操作
append(s, ...) // スライスへの追加
copy(dst, src) // スライスのコピー
clear(v) // スライスやmapのクリア
delete(m, key) // mapからの削除
// メモリ確保
make(T, ...) // スライス、map、チャネルの作成
new(T) // ゼロ値へのポインタの作成
// 複素数
complex(r, i) // 複素数の作成
real(c) // 実部の取得
imag(c) // 虚部の取得
// 型関連
min(x, ...) // 最小値(Go 1.21)
max(x, ...) // 最大値(Go 1.21)
// エラー処理
panic(v) // パニックの発生
recover() // パニックの回復
// 出力(デバッグ用)
print(...) // 標準エラーへの出力
println(...) // 標準エラーへの出力(改行つき)
これらが「式文で使えない」組み込み関数(len、cap、append など)と、使える組み込み関数(panic、print など)に分かれていたのは、前に学んだ式文の節で説明されたとおりです。副作用のない関数は、戻り値を捨てて呼ぶのがバグの可能性が高いため、式文として使うことが禁止されています。
おわりに
本日は、Go言語の言語仕様について解説しました。

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)


コメント