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

その他のデータ型は以下を参照ください。


型の調べ方

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"  // 「あいうえお」のコードポイント表記

関連ページ



スポンサード リンク