[Golang] 変数

2021-09-22 hit count image

Golangで変数の種類と変数の使い方について説明します。

概要

今回のブログポストではGolangで使える変数の種類について説明して、変数を使ってコードを作成する方法について説明します。

今回のブログポストで紹介するソースコードは下記のリンクで確認できます。

変数

Golangの変数について勉強するため、main.goファイルを生成して次のように修正します。

package main

import "fmt"

func main() {
  var num int = 1
  var message string = "Hello, World!"
  fmt.Println(num, message)

  num = 2
  message = "Hello, Universe!"
  fmt.Println(num, message)
}

このように修正したら、次のコマンドを実行してGolangで作成したプログラムを実行します。

go run main.go

そしたら下記のような結果が確認できます。

1 Hello, World!
2 Hello, Universe!

変数の宣言

Golangでは下記のように変数を宣言します。Golangでは変数を宣言した後、変数を使わない場合、コンパイルエラーが発生します。

// var 変数名 変数タイプ = 初期値
var num int = 1

変数を宣言する時にはvarキーワードを使って、どんなタイプの変数が保存されるのかタイプを指定する必要があります。

変数を宣言する時、次のように初期値を設定しなくて、省略することもできます。

var num int

他の言語とは違ってGolangでは初期値を設定しない場合、nullが保存されるんではなく、各タイプの基本値が保存されます。

  • 全ての整数タイプ(int, int8…): 0
  • 全ての実数タイプ(float, float8…): 0.0
  • bool: false
  • 文字列: ""
  • その他: nil

初期値を設定する場合次のように変数のタイプを省略することができます。

var num = 10

変数タイプを省略すると、Golangは初期値を確認してタイプを推論します。

最後では次のように:=(Short variable declarations)を使って変数を宣言することができます。

num := 10

タイプ定義

Golangではtypeキーワードを使って、既存のタイプにエイリアス(Alias)をつけることができます。これをGolangではタイプ定義(Defined type)と言います。

type myInt int

Golangが提供するintタイプをmyIntで提起しました。myIntintと同じメモリサイズを持っていて、intと同じ役割をしますが、intとは別タイプとして存在します。

var myNum myInt = 10
var num int = 10

fmt.Printf("%T\n", myNum)
fmt.Printf("%T\n", num)

上のようにプログラムを作成して実行すると、次のような結果を確認することができます。

main.myInt
int

Golnagではタイプが違うと、演算を実行することができません。したがって、演算を実行したい場合はタイプ変換をする必要があります。

変数タイプ

Golangでは次のようなタイプが使えます。

  • uint8, uint16, uint32, uint64
  • int8, int16, int32, int64
  • float32, float64
  • byte: uint8エイリアス
  • rune: UTF8形式の文字を1つ保存するとき使う変数、int32エイリアス
  • int: int32エイリアス
  • uint: uint32エイリアス
  • bool
  • string
  • 配列
  • スライス
  • 構造体
  • ポインタ
  • 関数タイプ
  • マップ
  • インタフェース
  • チャネル

タイプ変換

上で話しましたが、Golangでは変数のタイプが違うと演算を実行することができません。したがって、演算を実行するためには同じ変数タイプにあんるようにタイプを変換(Type Conversion)する必要がります。

var num1 int = 10
var num2 int32 = 10

// fmt.Println(num1 + num2) // ERROR!!
fmt.Println(num1 + int(num2))

var num3 float32 = 10.32
fmt.Println(num1 + int(num3))

違うタイプの変数で演算を試すとコンパイルエラーが発生します。この時、タイプ変換を使って同じタイプに編纂した後、演算を実行します。

上のコードを実行すると次のような結果が出ます。

20
20

変数のスコープ

Golangでは変数のスコープ(Scope)が存在します。変数は当該スコープ中のみで使えます。スコープは中括弧({})を使って表現します。

func main() {
  num1 := 10

  {
    num2 := 20
    fmt.Println(num2)
  }

  fmt.Println(num1)
  // fmt.Println(num2) // ERROR!!
}

num1はmain関数のスコープで使えますが、num2num1とは違って新しいスコープのみで使えます。したがって、下でfmt.Println(num2)num2を持ってるスコープの外からコールしたのでエラーが発生します。

パッケージグローバル変数

Golangの全てのコードは何かのパッケージに所属されています。この時関数の外で変数を宣言すると、パッケージ中で使えるパッケージグローバル変数を生成することができます。

var num int = 10

func main() {
    fmt.Println(num)
}

パッケージグローバルは同じパッケージならどこでも使えます。

空白識別子

Golangでは宣言した変数は必ず使えないとダメです。しかし、変数を割り当てはしたが、使わない場合、空白識別子(Blank identifier, _)を使ってエラーを発生されないようにすることができます。

func main() {
  tmp := make(map[string]string)

  tmp["name"] = "John"
  tmp["job"] = "Programmer"

  fmt.Println(tmp)

  for k, v := range tmp {
    fmt.Println(k, v)
  }

  for k := range tmp {
    fmt.Println(k)
  }

  for _, v := range tmp {
    fmt.Println(v)
  }
}

上の例ではmapタイプを使って変数を生成した後、変数を使う色んな方法を見せております。mapmakeを使って生成して、rangeforを使って全ての内容を画面に出力することができます。

rangeを使うとmapkeyvalueを取得することができます。keyvalue全てを使いたい場合もありますが、valueだけ使いたい場合もあります。

// ERROR!!
// for k, v := range tmp {
//     fmt.Println(v)
// }
for _, v := range tmp {
    fmt.Println(v)
}

この時、このように割り当てはしなければならないですが、使わない場合、空白識別子を使ってコンパイルエラーを発生しないようにすることができます。

完了

これでGolangの変数と変数を使う方法について基礎的な内容を調べてみました。ここで説明しなかった部分(map, sliceの使い方など)は他のブログポストでもっと詳しく説明します。

私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!

Posts