Go言語_変数と型

変数宣言

Go言語の変数宣言は変数名の後に型を指定する形式となります。


var 変数名 型

初期値が指定されない場合、変数は宣言時に型に合わせて「ゼロ値」というデフォルト値で初期化されます。

例えばint型ならば0、string型ならば空文字""、bool型ならばfalse と初期化されます。


初期値の指定

宣言時に初期値を指定するには、値を代入します。


var str string = "The Go Programming Language"

一度に複数の宣言を行う場合、以下のように記述します。


var str1, str2, str3 string = "The Go", "Programming", "Language"

括弧で囲う記述もでき、2つ目以降の型を省略することができます。


var (
    str1 string = "The Go"
    str2        = "Programming"
    str3        = "Language"
)

型推論と省略形

Go言語では、型は静的に推論されます。そのため型を省略することができます。


var str = "The Go Programming Language"

さらに、変数宣言と初期化を行う場合に、var と型宣言を省略して「:=」演算子を用いることができます。

可読性を考慮して、変数型を明示する必要性がない場合に下記形式を多く用います。


str := "The Go Programming Language"

変数

基本型

Goでは、以下の基本型が用意されています。


int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex64 complex128
bool byte
string rune
  • 複素数型(complex data type)
    • complex64は複素数型で2つのfloat32型で構成され、complex128は複素数型で2つのfloat64型で構成されます。
  • rune型
    • runeはUnicodeのコードポイントです。文字列を文字単位で扱う場合に rune を使います。

その他のデータ型は Go言語_コンポジット型 を参照ください。


型の調べ方

reflect.TypeOf()関数で変数の型を調べることができます。


package main

import (
	"fmt"
	"reflect"
)

func main() {
	fmt.Println(reflect.TypeOf(1))    // int
	fmt.Println(reflect.TypeOf(1.1))  // float
	fmt.Println(reflect.TypeOf(""))   // string
	fmt.Println(reflect.TypeOf(true)) // bool
}

定数

「const」キーワードを用いると定数宣言になります。


const str string = "The Go Programming Language"

列挙するには丸括弧を用います。


const (
    One   = 1
    Two   = 2
    Three = 3
)

さらに、値が連番になっている場合は、「iota」を用いることができます。

「iota」は定数生成器(constant generator)と呼ばれ、ゼロから始まり順番に加算していきます。

これにより、C言語におけるenumと同様の定義が可能です。


const (
   One = iota + 1
   Two
   Three
)

ポインタ

Go言語では、ポインタが用意されています。

なお、ポインタのゼロ値はnullではなく「nil」です。


var pointer *int = nil

ポインタへの代入

使い方はC言語と同様であり、ポインタの値は変数のアドレスとなります。


package main

import "fmt"

func main() {
    val := 123
    p := &val
    fmt.Println(*p)  // 123
    *p = 234
    fmt.Println(val) // 234
}

new()関数

変数を作成する方法として、組み込みのnew()関数を用いることができます。


package main

import "fmt"

func main() {
	p := new(string)
	fmt.Printf("%p=%s\n", p, *p)
	*p = "Go lang pointer"
	fmt.Printf("%p=%s\n", p, *p)
}

ポインタの開放

Go言語には、ガベージコレクタが組み込まれているため、確保したメモリを明示的に解放する必要はありません。

これは、C言語のようにfree()でメモリを解放する必要がないということです。

ただし、ガベージコレクタは到達不可能な変数に対して実行されるので、意図しないポインタ参照を残してしまうと解放されないメモリリークとなります。


リテラル

整数リテラル

Go言語では10進数、8進数、16進数の整数リテラルを使用することができます。

8進数の場合は頭に0を、16進数の場合は頭に0xまたは0Xを付けます。


d := 12345 // 10進数
o := 0755  // 8進数
x := 0x1F  // 16進数

浮動小数点数リテラル

浮動小数点型は10進数のみ使用できます。

指数表記を利用することもできます。


3.1415
24.      // 24.0
.75      // 0.75
1.25e-3  // 0.00125の指数表記

虚数リテラル

複素数型向けの虚数リテラルは、数字の後ろにiを付けることで表現します。


5i
-4i

ルーンリテラル

ルーン(Rune)とは、Unicodeのコードポイントを表現する整数のことです。

ルーンリテラルはルーン1つを表現するリテラルです。


'a'
'あ'     // Unicodeであるためマルチバイト文字列もルーン1つで表現可能
'\n'     // エスケープシーケンスを使用できる
'\u12AB' // コードポイントを直接記述可能

文字列リテラル

バッククォートで囲まれた文字列を「raw文字列リテラル」と呼びます。

エスケープシーケンス・コードポイントは評価されず、書かれた文字列を文字列のまま扱います。


`message\n`    // 改行ではなく\とnの二文字として扱われる。

ダブルクォートで囲まれた文字列を「interpreted文字列リテラル」と呼びます。

エスケープシーケンスや、Unicodeコードポイントが評価されます。


"message\n"                     // 末尾に改行が挿入される
"\u3042\u3044\u3046u3048u3050"  // 「あいうえお」のコードポイント表記

関連ページ