基本型
数値型
整数型には符号付きのint8、int16、int32、int64、int、符号なしのuint8、uint16、uint32、uint64、uint、uintptrがあります。日常の計数にはintを使うことが多いです。
浮動小数点は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の別名で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: 語byteとruneは独立した型名ではなく、uint8とint32の別名です。
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 // コンパイルエラー: 暗黙変換はない