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" // 「あいうえお」のコードポイント表記
関連ページ
- Go言語_プログラムの作成
- Go言語_コマンドライン引数
- Go言語_変数と型
- Go言語_コンポジット型
- Go言語_制御構文
- Go言語_関数
- Go言語_演算子
- Go言語_メソッド
- Go言語_インターフェース