5. 変数と定数
5.1 変数
変数とは、値を保持するための格納場所です。
変数には型があり、同じ型の値しか代入できません。
変数の宣言
変数の宣言は以下の書式で行います。
var 変数名 型 = 初期値 // 復数宣言 var ( 変数名1 型1 = 初期値1 変数名2 型2 = 初期値2 ) var 変数名1, 変数名2 型 = 初期値1, 初期値2
初期値を指定しない宣言も可能です。この場合、初期値にはゼロ値が入ります。
ゼロ値は型によって異なります。例えば、数値なら0、文字列なら"" がゼロ値です。
var 変数名 型 // 復数宣言 var ( 変数名1 型1 変数名2 型2 ) var 変数名1, 変数名2 型
また、型を明記しない省略形の変数宣言もあります。
型は初期値によって決まります。
var 変数名 = 初期値 // 復数宣言 var ( 変数名1 = 初期値1 変数名2 = 初期値2 ) var 変数名1, 変数名2 = 初期値1, 初期値2
以下の省略宣言は関数内でしか使用できません。
変数名 := 初期値 // 復数宣言(未宣言の変数が1つ以上あること) 変数名1, 変数名2 := 初期値1, 初期値2
例)
var greet string = "hello" var greet string // 変数greetには、ゼロ値の""が入る var greet = "hello" // 変数greetは、初期値からの型推論でstring型となる greet := "hello" // 変数greetは、初期値からの型推論でstring型となる
変数の代入
変数の代入例を見てみます。
package main import "fmt" func main() { // s は型推論で文字列型となる s := "hello" // hello と表示される fmt.Println(s) // 代入 s = "bye" // bye と表示される fmt.Println(s) }
5.2 定数
定数とは、不変の変数です。
定数の宣言
定数とは、再代入ができない変数のようなものです。
定数宣言時に値が決まります。
const 定数名 = 値 // 復数宣言 const ( 定数名1 = 値1 定数名2 = 値2 ) const 定数名1, 定数名2 = 値1, 値2
型を指定した定数の宣言も可能です。
const 定数名 型 = 値 // 復数宣言 const ( 定数名1 型1 = 値1 定数名2 型2 = 値2 ) const 定数名1, 定数名2 型 = 値1, 値2
型を指定しない場合はuntypedとなり、型がない定数となります。
具体的な違いを見てみましょう。
string型を指定した場合、string型のエイリアスであるMyString型には代入できません。
const typedHello string = "Typed String : Hello" type MyString string var myString MyString = typedHello // エラーになる
string型を指定しない場合、string型のエイリアスであるMyString型には代入できます。
const untypedHello = "Untyped String : Hello" type MyString string var myStringOK MyString = untypedHello // 代入できる
untypedの定数は以下の種類があります。
- untyped string
- untyped int
- untyped rune
- untyped float64
- untyped complex128
- untyped bool
文字列
// untyped string const Hello = "Hello" // string const Hello string = "Hello"
整数
// untyped int const MyInt = 3 // typed int const MyInt int = 3
浮動小数点数
// untyped float64 const Zero = 0.0 // typed float64 const Zero float64 = 0.0
複素数
// untyped complex128 const Two = 2.0 + 0i // typed complex128 const Two complex128 = 2.0 + 0i
Boolean
// untyped bool const True = true // typed bool const True bool = true
iota
Go言語ではiotaとよばれる定数生成器があります。
列挙された定数に対して、untyped int を定義できます。
const ( c0 = iota // c0 == 0 c1 // c1 == 1 c2 // c2 == 2 )
() で囲まれたconst宣言リストの中では、最初の宣言以外の式リストは省略できます。
iotaと併用することで簡単に連続値の宣言が可能です。
type Weekday int const ( Sunday Weekday = iota // Sunday == 0 Monday // Monday == 1 Tuesday // Tuesday == 2 Wednesday // Wednesday == 3 Thursday // Thursday == 4 Friday // Friday == 5 Saturday // Saturday == 6 )