Go言語の組み込み関数
2026/07/28

概要

組み込み関数は事前宣言されており、インポートなしで使えます。スライス・マップ・チャネルの確保や長さ操作など、言語の基本操作を担います。

newとmake

new(T)は任意の型Tのゼロ値を置いた領域を確保し、そのアドレス*Tを返します。メモリの置き場には、関数の呼び出しに合わせて使うスタックと、関数をまたいで値を置けるヒープがあります。ヒープ上の不要な領域はガベージコレクションが回収します。どちらに置くかはGoが決め、プログラマが指定する必要はありません。newはヒープ専用の確保ではありません。

p := new(int) // *int、*p == 0

makeはスライス・マップ・チャネルだけを対象に、内部構造を初期化したTそのものを返します。ポインタではありません。これらの型は内部構造の初期化が必要なためnewではなくmakeを使います。new([]int)nilスライスへのポインタを返すだけで、要素を足せる状態にはしません。

s := make([]int, 0, 10) // len=0, cap=10
m := make(map[string]int)
ch := make(chan int, 1)

lenとcap

lenは配列、スライス、マップ、文字列、チャネルの長さ(またはバッファ内の要素数)を返します。スライスと配列ではcapが容量を返します。

s := make([]int, 2, 5)
fmt.Println(len(s), cap(s)) // 2 5

m := map[string]int{"a": 1}
fmt.Println(len(m)) // 1

appendとcopy

appendは新しいスライスヘッダを返します。cap不足時は新しい元配列が割り当てられることがあります。戻り値を呼び出し元の変数へ代入しないと、呼び出し元から見た長さは変わりません。再割り当て後も古いヘッダを使い続けると、別の配列を指している可能性があります。

s := []int{1}
s = append(s, 2, 3)
s = append(s, []int{4, 5}...)

copy(dst, src)dstへ要素をコピーし、実際にコピーした個数を返します。コピー数は両者の短い方の長さまでです。

dst := make([]int, 2)
n := copy(dst, []int{10, 20, 30})
fmt.Println(n, dst) // 2 [10 20]

deleteとclear

delete(m, key)はマップからキーを削除します。キーが無くてもパニックにはなりません。

m := map[string]int{"a": 1}
delete(m, "a")
delete(m, "missing") // 安全

clear(Go 1.21以降)は型によって動きが違います。マップではすべてのエントリを削除して空にします。スライスでは各要素をゼロ値にし、長さlenはそのままです。

m := map[string]int{"a": 1, "b": 2}
clear(m)
fmt.Println(len(m)) // 0

s := []int{1, 2, 3}
clear(s)
fmt.Println(s, len(s)) // [0 0 0] 3

close

close(ch)はチャネルを閉じ、「もう送らない」ことを示します。送信側が呼ぶのが慣習で、rangeの終了条件にもなります。閉じたチャネルへの送信はパニックです。

ch := make(chan int, 1)
ch <- 1
close(ch)
for v := range ch {
    fmt.Println(v) // 1
}

minとmax

minmax(Go 1.21以降)は、比較可能な同じ型の引数のうち最小・最大を返します。

fmt.Println(min(3, 1, 2)) // 1
fmt.Println(max(3, 1, 2)) // 3

panicとrecover

panicは実行を中断し、recoverdefer内でその中断から復帰します。想定できる失敗は通常errorで返し、panicはプログラムのバグや回復不能な状態向けです。