Go言語の基本型と複合型
2026/07/28

基本型

数値型

整数型には符号付きのint8int16int32int64int、符号なしのuint8uint16uint32uint64uintuintptrがあります。日常の計数にはintを使うことが多いです。

浮動小数点はfloat32float64です。複素数はcomplex64complex128です。

整数リテラルは10進、2進(0b/0B)、8進(0/0o/0O)、16進(0x/0X)を書けます。可読性のため桁の間に_を入れられます。

decimal := 42
binary := 0b101010
octal := 0o52
hex := 0x2A
withSep := 1_000_000

浮動小数点リテラルは小数点表記や指数表記を取れます。虚数リテラルは末尾にiを付けます。1のような整数リテラルは、代入先がfloat64float32ならその浮動小数点型として解釈されます。

f := 3.14159
e := 1.5e-10
imag := 2i

var x float64 = 1 // 1はfloat64になる
var y float32 = 2 // 2はfloat32になる

論理型

booltruefalseのみを取ります。

文字と文字列

byteuint8の別名、runeint32の別名でUnicodeコードポイントを表します。

ルーンリテラルはシングルクォートで囲み、1つのUnicodeコードポイントを表します。

r := 'あ'
newline := '\n'

stringはイミュータブルなバイト列です。ソースはUTF-8です。

文字列リテラルはダブルクォートまたはバッククォートで囲みます。バッククォート文字列は改行を含む生の文字列です。

s := "hello"
raw := `line1
line2`

文字列はrangeでルーン単位に走査できます。

for i, r := range "Go言語" {
    fmt.Printf("%d: %c\n", i, r)
}

実行結果(iはバイト位置、rはルーン。日本語はUTF-8で1文字が複数バイトのため、次のインデックスが飛ぶ):

0: G
1: o
2: 言
5: 語

byteruneは独立した型名ではなく、uint8int32の別名です。

s := "Go言語"
b := []byte(s)
fmt.Println(b)
fmt.Println(string(b))

var ch byte = 'A' // uint8 の別名
var r rune = '語' // int32 の別名
fmt.Printf("%T %c\n", ch, ch)
fmt.Printf("%T %c\n", r, r)

実行結果:

[71 111 232 168 128 232 170 158]
Go言語
uint8 A
int32 語

[]byte(s)string(b)でバイト列と文字列を相互変換できます。文字列はイミュータブルで、内容を書き換えられません。[]byteはミュータブルで、要素を書き換えられます。[]byte(s)は常にコピーします。スライスで要素を書き換えても、元の文字列は変わりません。string(b)は、変換後もbを書き換える可能性があるときはコピーします。コピーされていれば、bを変更しても得られた文字列の内容は変わりません。変換後にbをもう使わないとコンパイラが判断できる場合は、実装によってコピーを省略できることがあります(省略しても得られる文字列の値は同じです)。

コピーの有無は、スライス側を書き換えたあと元の文字列や得られた文字列がどう見えるかで確認できます。

s := "hello"
b := []byte(s)
b[0] = 'J'
fmt.Println(s)         // hello(s は変わらない)
fmt.Println(string(b)) // Jello

b2 := []byte{'h', 'i'}
t := string(b2)
b2[0] = 'H'
fmt.Println(t)          // hi(t は変わらない)
fmt.Println(string(b2)) // Hi

実行結果:

hello
Jello
hi
Hi

複合型の概要

説明
配列[n]T長さ固定
スライス[]T可変長のビュー
マップmap[K]Vキーと値の集合
構造体structフィールドのまとまり
ポインタ*T値への参照
関数第一級の値
インターフェースメソッド集合の抽象
チャネルchan Tゴルーチン間通信

関数型

関数型はパラメータと結果の型のリストで書きます。

type Handler func(int) error
var fn Handler = func(n int) error { return nil }

チャネル型

chan Tは型Tの値を送受信するチャネルです。chan<- Tは送信専用、<-chan Tは受信専用です。

ch := make(chan int)
sendOnly := (chan<- int)(ch)
recvOnly := (<-chan int)(ch)

型定義と型エイリアス

typeで新しい名前を付けられます。

type Celsius float64   // 型定義: Celsiusはfloat64とは別の型
type ID = int          // 型エイリアス: IDとintは同一型

型定義は新しい型を導入し、基底型が同じでも代入には変換が必要な場合があります。型エイリアスは既存の型に別名を付けるだけです。

型変換

暗黙変換はありません。異なる型の値を使うときはfloat64(n)のように明示的に変換します。

var i int = 42
f := float64(i)

type Celsius float64
var c Celsius = 100
var t float64 = float64(c)

// var x float64 = i // コンパイルエラー: 暗黙変換はない