[入門][GO]変数 / 型 / 定数について

Go

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

コメント

タイトルとURLをコピーしました