golang の変数・型・定数・リテラルについてまとめる。
変数
変数は var 変数名 型 で定義する。
var num int
右辺で型が推測できる場合は 変数名 := 値 で変数定義と初期化ができる。
num := 10
右辺の型の予測は リテラル も参考のこと。
型
- 論理値型(
bool) - 数値型(
intint8int16int32int64byteuintuint8uint16uint32uint64)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 進数は頭に0x0Xをつける
- 10 進数、 8 進数、 16 進数の整数リテラルがあり、 8 進数は頭に
- 浮動小数点リテラル
- 浮動小数点定数を表す小数表現で、整数部・小数点(
.)・小数部・指数部(e+E+)がある- 100 は
1e21.e21e+21E2、 0.01 は1e-21.e-21E-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
}
おすすめ書籍
リンク
