Goの変数・型・定数・リテラル

golang の変数・型・定数・リテラルについてまとめる。

  • 変数
  • 定数
  • リテラル
  • その他 Tips

変数

変数は 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)」
    • bypeuint8 の別名
    • runeint32 の別名
  • 文字列型( string
    • []byte のように振る舞うが 値は不変
  • 配列型( [サイズ]型
  • スライス型( []型
  • 構造体型( struct{}
  • ポインタ型( *型
  • 関数型( func(引数) 返り値型
  • インタフェース型( interface{}
  • マップ型( map[型]型
  • チャネル型( chan 型 <-chan 型 chan<- 型

定数

定数名 = 値:= ではない)で定義でき、値を変更することはできない。

リテラル

リテラル とは、プログラムのソースコードにおいて使用される、 数値や文字列を直接に記述した定数 のこと。
golang には以下のリテラルがある。

  • 整数リテラル
    • 10 進数、 8 進数、 16 進数の整数リテラルがあり、 8 進数は頭に 0 を、 16 進数は頭に 0x 0X をつける
  • 浮動小数点リテラル
    • 浮動小数点定数を表す小数表現で、整数部・小数点( . )・小数部・指数部( e+ E+)がある
      • 100 は 1e2 1.e2 1e+2 1E2 、 0.01 は 1e-2 1.e-2 1E-2 などと表現できる
  • 虚数リテラル
    • 複素数定数の虚数部分の小数表現
    • 小数整数と小文字 i で構成される
  • ルーンリテラル
    • Unicodeコードポイントに一致する整数値( int32
    • シングルクォート( ' )でくくって表現する
    • バックスラッシュを使用したマルチ文字シーケンスの各書式でエンコード( \' )することで、シングルクォート文字自体の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 を意味し、 rune1 文字 を意味する。
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
}