golang の変数・型・定数・リテラルについてまとめる。
変数
変数は var 変数名 型
で定義する。
var num int
右辺で型が推測できる場合は 変数名 := 値
で変数定義と初期化ができる。
num := 10
右辺の型の予測は リテラル も参考のこと。
型
- 論理値型(
bool
) - 数値型(
int
int8
int16
int32
int64
byte
uint
uint8
uint16
uint32
uint64
)int
はアーキテクチャにより異なり、32 ビットもしくは 64 ビットとなる- 32 ビットの場合の値域は「-1«31 〜 1«31 - 1(-2147483648 to 2147483647)」
bype
はuint8
の別名rune
はint32
の別名
- 文字列型(
string
)[]byte
のように振る舞うが 値は不変
- 配列型(
[サイズ]型
) - スライス型(
[]型
) - 構造体型(
struct{}
) - ポインタ型(
*型
) - 関数型(
func(引数) 返り値型
) - インタフェース型(
interface{}
) - マップ型(
map[型]型
) - チャネル型(
chan 型
<-chan 型
chan<- 型
)
定数
定数名 = 値
( :=
ではない)で定義でき、値を変更することはできない。
リテラル
リテラル とは、プログラムのソースコードにおいて使用される、 数値や文字列を直接に記述した定数 のこと。
golang には以下のリテラルがある。
- 整数リテラル
- 10 進数、 8 進数、 16 進数の整数リテラルがあり、 8 進数は頭に
0
を、 16 進数は頭に0x
0X
をつける
- 10 進数、 8 進数、 16 進数の整数リテラルがあり、 8 進数は頭に
- 浮動小数点リテラル
- 浮動小数点定数を表す小数表現で、整数部・小数点(
.
)・小数部・指数部(e+
E+
)がある- 100 は
1e2
1.e2
1e+2
1E2
、 0.01 は1e-2
1.e-2
1E-2
などと表現できる
- 100 は
- 浮動小数点定数を表す小数表現で、整数部・小数点(
- 虚数リテラル
- 複素数定数の虚数部分の小数表現
- 小数整数と小文字
i
で構成される
- ルーンリテラル
- Unicodeコードポイントに一致する整数値(
int32
) - シングルクォート(
'
)でくくって表現する - バックスラッシュを使用したマルチ文字シーケンスの各書式でエンコード(
\'
)することで、シングルクォート文字自体のUnicode値も表せる
- Unicodeコードポイントに一致する整数値(
- 文字列リテラル
- 未加工文字列リテラル( raw 文字列リテラル)はバッククォート、解釈有文字列リテラル( interpreted 文字列リテラル)はダブルクォートで囲む
ルーンリテラル
ちょっとややこしいかもしれないので補足。
例えば 、リテラル 'a'
は文字 a
、Unicode 「 U+0061 」( '\u0061'
) 、値 0x61
を表す 1 バイトの値。
var a rune
a = 'a'
fmt.Println(a) // 97
a = 0x61
fmt.Println(a) // 97
a = '\u0061'
fmt.Println(a) // 97
a = 97
fmt.Println(a) // 97
fmt.Printf("%d\n", a) // 97
fmt.Printf("%c\n", a) // a
fmt.Printf("%U\n", a) // U+0061
文字列リテラル
ちょっとややこしいかもしれないので補足。
未加工文字列リテラル はクオート内を全く解釈することがなく、そのまま出力する。
一方、 解釈有文字列リテラル はダブルクオート内の バックスラッシュによるエスケープを解釈 する。
var a string
a = `\n`
fmt.Println(a) // \n
a = "\n"
fmt.Println(a) // 改行
a = "\u0061"
fmt.Println(a) // a
その他Tips
byte と rune
byte
はあくまで 1 byte を意味し、 rune
は 1 文字 を意味する。
1 文字は数 byte で表されることもあるため、 rune
が存在する。
str := "あいうえお"
buf := []byte("あいうえお")
runes := []rune("あいうえお")
fmt.Println(str) // あいうえお
fmt.Println(string(buf)) // あいうえお
fmt.Println(string(runes)) // あいうえお
for i := 0; i < len(str); i++ {
b := str[i] // byte 単位で取得される
fmt.Println(b) // 227, 129, 130, 227, 129, 132, 227, 129, 134, 227, 129, 136, 227, 129, 138
// 「あ」は 3 byte
}
for _, r := range str { // 1 文字( rune )単位で取得される
fmt.Println(r) // 12354, 12356, 12358, 12360, 12362
}
おすすめ書籍
リンク