A Tour Of Goを進めて行っています。
このチュートリアルを見て実際にコードを動かすだけでも良い感じで学習できますね🤔
自分の中で整理したり、理解度を深めるために定期的にGo入門した内容をまとめたいと思います。
Go学習者の方でA Tour Of Goが難しくてよくわからんという方は一緒に見ていただけると幸いです。
今回は変数と型と定数についてまとめてみました。
Goで変数を宣言する
変数の宣言方法や、スコープについて書いています。
Tour Of Goの8-10ページ目あたりの内容です。
関数内での変数宣言
hello, worldを表示する簡単なプログラムを書きました。(ファイル名:myhello.go)
package main
import "fmt"
func main() {
var helloText string
helloText = "hello, world"
fmt.Println(helloText)
}
変数を宣言している箇所は下記になります。
Goではvarをつけて変数を宣言します。helloTextという変数をstring型で作成しています。
var helloText string
その後に、文字列(hello, world)を格納して出力しています。
実行すると、こうなります。
変数に入れたものが出力されました。
$ go run myhello.go
hello, world
複数の変数を同時に宣言する
下記のようなコードを書いて試しみました。(ファイル名:multi_init_variable.go)
package main
import "fmt"
var test1, test2 int = 77, 44
func main() {
var number1, number2, number3 int = 100, 50, 70
var name1, name2 string // 初期値を入れずに宣言
name1 = "taro"
name2 = "hanako"
fmt.Println(test1, test2)
fmt.Println(number1, number2, number3)
fmt.Println(name1, name2)
}
変数を同時に宣言するときはカンマ(,)区切りで変数名を書いて、型を書きます。
その後に初期値を入れなかったり入れたりできます。
下記はそれぞれ、100, 50, 70を初期値にして変数宣言しています。
var number1, number2, number3 int = 100, 50, 70
これは初期値を取らない代わりに、宣言した後に値を入れています。
var name1, name2 string // 初期値を入れずに宣言
name1 = "taro"
name2 = "hanako"
実行すると結果はこうなります。
複数宣言している場合も問題なく、値が格納されて出力されました。
$ go run multi_init_variable.go
77 44
100 50 70
taro hanako
変数の型指定を省略する
下記のようなコードを書いて試してみます。(ファイル名:short_variable.go)
package main
import "fmt"
func main() {
name := "jiro"
number, age, fullName := 99, 23, "tanaka jiro"
fmt.Println(name)
fmt.Println(number, age, fullName)
}
変数の型を省略する場合はvarを書かずに、代入のところを「:=」にします。
name := "jiro"
複数書く場合はカンマで繋いで、初期値もカンマ繋ぎで代入できます。
number, age, fullName := 99, 23, "tanaka jiro"
こんな感じで変数を宣言した場合は変数の型は、代入した値によって決まります。
上記で言うと、numberとageはintでfullNameはstringになります。
実行すると、下記のように出力されます。
省略した場合も問題なく出力されました。
$ go run short_variable.go
jiro
99 23 tanaka jiro
変数の有効範囲(スコープ)について
全体で使いたい場合は、関数の外に関数内だけで使う場合は、関数の中に書きます。
関数の中で書いたものを、他の関数で使うことはできません。
下記のコードを書いて試してみました。(ファイル名:scope.go)
package main
import "fmt"
var number int = 100
func main() {
var helloText string
helloText = "hello, world"
fmt.Println(helloText)
fmt.Println(number)
test()
}
func test() {
fmt.Println(number)
// fmt.Println(helloText) これはエラーになる
}
numberという変数を宣言して、main関数とtest関数の中で使っています。
この変数は関数の外で宣言しているので使えますが、helloTextは関数内でしか使えません。
実行すると、こうなります。
main関数もtest関数もnumberを出力していますが関数外に定義しているので、同じ値が出力されました。
$ go run scope.go
hello, world
100
100
変数の初期値を代入しない場合
変数の初期値を代入しない場合の値は、0や空になります。変数の方によって入る値は変わります。
var number int // intは代入がない場合は0
var floatNumber float64 // floatは代入がない場合は0
var boolValue bool // boolは代入がない場合はfalse
var myText string // stringは代入がない場合は""(空)
Goの変数の型について
変数には型があります。型によって、代入できるデータが決まります。(intだったら数値、stringなら文字列など)
Goで使える型は下記です。
Tour Of Goの11ページ目あたりの内容です。
bool
string
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
byte // uint8 の別名
rune // int32 の別名
float32 float64
complex64 complex128
型の内容は下記の通りです。
複素数は馴染みがないので、よくわからないです😅
型 | 内容 |
---|---|
bool | 論理値 / trueまたはfalse、デフォルトはfalse |
string | 文字列 / 文字列の代入ができる、デフォルトは””(空) |
int | 整数:サイズは実行環境に依存する(32bit or 4bit) |
int8 | 整数:範囲 => -128 – 127 |
int16 | 整数:範囲 => -32768 – 32767 |
int32 | 整数:範囲 => -2147483648 – 2147483647 |
int64 | 整数:範囲 => -9223372036854775808 – 9223372036854775807 |
uint | 符号なし整数(32bit or 4bit) |
uint8 | 符号なし整数:範囲 => 0 – 255 |
uint16 | 符号なし整数:範囲 => 0 – 65535 |
uint32 | 符号なし整数:範囲 => 0 – 4294967295 |
uint64 | 符号なし整数:範囲 => 0 – 18446744073709551615 |
float32 | 浮動少数点数 |
float64 | 浮動少数点数 |
complex64 | 複素数 |
complex128 | 複素数 |
Goの定数について
定数は決まった値を入れておくもので、変数のように後で内容を変更することはできません。
goで使える定数は、文字・文字列・数値のみのようです。
Tour Of Goの15ページ目あたりの内容です。
下記のコードで確認してみました。(ファイル名:test_const.go )
package main
import "fmt"
const coffeePrice = 100
const mac = "マクドナルド"
func main() {
// coffeePrice = 10 => これはエラーになる
// mac = "マックブック" => これはエラーになる
fmt.Println(coffeePrice, mac)
}
関数の外で coffeePrice=100 と mac=”マクドナルド” を定義しています。
どちらも関数の中で、変更しようとするとエラーになります。
定数の使い所は、全体で参照できるところに定義しておいて、プログラムの中で判定する時などに使います。
1箇所で管理しておくと、値が変わった場合などは1箇所だけ変えればいいので管理しやすいです。
あとは数値などで判定されると意味合いが分かりませんが、定数名をつけることによって見通しがよくなり、コードの可読性が増します。
実行すると、こうなります。
$ go run test_const.go
100 マクドナルド
番外編:PHPと比べてみた
なんとなく、PHPで書くとどうなるかやってみました。
変数宣言
PHPでは$をつけておくと変数になります。
型は値によって、勝手に判断してくれます。
php > $value = "apple";
php > echo $value;
apple
php > $value = 12;
php > echo $value;
12
php > $value = 3.14;
php > echo $value;
3.14
上記は対話モードで確認してます。
変数に文字列(apple)を入れて、出力して次は12を入れて出力。
最後に3.14を入れて出力しています。動的に型が変わるので、良くも悪くもどんなデータでも大丈夫ですね…
型
上記のように型については、勝手に判断してくれるので宣言する必要がありません。
明示的に型変換して、変数に入れておくことはできます。
php > $hoge = "hello";
php > echo $hoge;
hello
php > echo gettype($hoge);
string
php > $hoge = (int)"123";
php > echo gettype($hoge);
integer
php > echo $hoge;
123
変数に文字列(hello)を入れて出力して、gettype関数で型を確認しています。
文字列なので string になってますね。
次に文字列の123を数値にキャストして、変数に入れて、型を確認した後に出力しています。
数値が入ったのでintegerになってますね。
定数
phpでは定数はdefineで定義するかconstを使います。
php > define("MAC", "マクドナルド");
php > echo MAC;
マクドナルド
変数は$ですが、定数は何もつけずに参照します。
constを使う場合はこんな感じです。
<?php
class Test {
const fuga = "hoge";
function main() {
echo self::fuga;
}
}
$test = new Test();
echo $test->main();
const hoge = "test";
echo hoge;
classの中で使うパターンと、classの外で使うパターンを書いています。
$ php temp.php
hoge
test
コメント