基本型
数値型
整数型には符号付きの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へ代入できない