Go言語の基本型
2026/09/13

基本型

数値型

整数型には符号付きのint8、int16、int32、int64、int、符号なしのuint8、uint16、uint32、uint64、uint、uintptrがあります。

浮動小数点はfloat32とfloat64です。複素数はcomplex64とcomplex128です。

整数リテラルは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のような整数リテラルは、代入先がfloat64やfloat32ならその浮動小数点型として解釈されます。

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

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

論理型

boolはtrueとfalseのみを取ります。

文字と文字列

byteはuint8のエイリアス、runeはint32のエイリアスです。エイリアスなのでそれぞれuint8、int32と同一型です。runeはUnicodeコードポイントを表すときに使います。

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

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

stringはイミュータブルなバイト列です。

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

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

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

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

// 0: G
// 1: o
// 2: 言
// 5: 語 // 日本語はUTF-8で1文字が複数バイトのためインデックスが飛ぶ

エイリアスなので、%Tはuint8とint32を表示します。

s := "Go言語"
b := []byte(s)
fmt.Println(b)                // [71 111 232 168 128 232 170 158]
fmt.Println(string(b))        // Go言語

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

[]byte(s)とstring(b)でバイト列と文字列を相互変換できます。文字列はイミュータブルなので要素を書き換えられません。[]byteは要素を書き換えられます。変換で得たスライスを書き換えても、変換元の文字列は変わりません。[]byteから得た文字列も、その後スライスを書き換えても変わりません。

s := "hello"
b := []byte(s)
b[0] = 'J'
fmt.Println(s)         // hello
fmt.Println(string(b)) // Jello

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

型定義と型エイリアス

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        // OK: 非型付き定数100はCelsiusとして使える
var t float64 = float64(c)

// var x float64 = i       // NG: 型付きのintはfloat64へ代入できない