静的型付け言語・Goの変数宣言を理解する

Go言語
この記事は約11分で読めます。
Go初学者
Go初学者

Go言語での変数宣言の方法が知りたいな…

この記事では、Go言語の変数宣言について知ることができます!
  • Go言語での変数宣言の方法2種類
  • 2種類の変数宣言の使い分け
  • 静的型付け言語特有の変数での注意点

プログラミング言語を学習する上で、”Hello World”の出力の次に学習するのが「変数」でしょう。

Go言語は静的型付け言語で、「型」には厳格なプログラミング言語です。

Pythonなどを学習してきた方であれば、若干の違いがあります。

Go言語の変数宣言を理解できるようにしましょう。

型については、当ブログ記事を参考にしてください。

もりぴ
この記事を書いた人

XHTML1.0時代にHTML&CSSを勉強した経験あり。無趣味だった私が2020年5月からプログラミング学習を開始し現在も挫折せずに趣味で学習を楽しんでいる51歳。プログラミングの楽しさをブログを通してお伝えしていきます。

もりぴをフォローする

Go言語での標準的な変数宣言の形式(varを使用)

Go言語で変数宣言する一般的な形式は…

var 変数名 型 = 値

となっています。

もりぴ
もりぴ

それでは、実際にコードで説明していきますね。

// 一般的変数定義
package main

import "fmt"

func main(){
    // var 変数名 型 = 値
    // 整数型int
    var i int = 1
    fmt.Println(i)
}
この変数宣言では…
  • 変数名 i
  • 型 int int型は整数値を代入できる型
  • 値 1 int型なので整数値
// 出力結果
$ go run main.go
1
もりぴ
もりぴ

それでは、もうひとつ文字列を代入できる変数宣言をしましょう。

// 一般的な変数定義
package main

import "fmt"

func main(){
    // var 変数名 型 = 値
    // 文字列型string
    var s string = "Hello World"
    fmt.Println(s)
}
// 出力結果
$ go run main.go
Hello World

この他にも、小数(実数)を格納できる型の float32float64(こっちが一般的)と、真偽値を格納できる bool などがあります。

// 一般的な変数定義
package main

import "fmt"

func main(){
    // var 変数名 型 = 値
    var i int = 1
    var fl64 float64 = 2.3
    var s string = "Hello World"
    var t bool = true
    var f bool = false

    fmt.Println(i, fl64, s, t, f)
}
// 出力結果
$ go run main.go
1 2.3 Hello World true false

複数の同じ型の変数を宣言する場合

同じ型で複数の変数を宣言する時、省略して記述することもできます。

var 変数名1, 変数名2, … 型 = 値1, 値2, …
変数は2つ以上でも大丈夫です。

// 複数の同じ型の変数を宣言する
package main

import "fmt"

func main(){
    // var 変数名1, 変数名2, ... 型 = 値1, 値2, ...
    var t, f bool = true, false

    fmt.Println(t, f)
}
// 出力結果
$ go run main.go
true false

型の違う変数をまとめて宣言する

Go言語では、型の違う変数を一度に宣言することができます。

この方法で宣言すると var の記述を一回だけに省略できます。

// 型の違う変数をまとめて宣言
package main

import "fmt"

func main(){
    var (
        i int = 1
        fl64 float64 = 2.3
        s string = "Hello World"
        t bool = true
        f bool = false
    )
    fmt.Println(i, fl64, s, t, f)
}
// 出力結果
$ go run main.go
1 2.3 Hello World true false

変数宣言時に初期化しない場合(宣言時に値を代入しない時)

あらかじめ変数宣言をしておき、あとから値を代入することもできます。

// 変数宣言時に初期化しない場合
package main

import "fmt"

func main(){
    var (
        i int
        fl64 float64
        s string
        t bool
        f bool
    )
    fmt.Println(i, fl64, s, t, f)
}

出力結果には、それぞれの型の初期値が代入されています。

// 出力結果
$ go run main.go
0 0  false false
もりぴ
もりぴ

string型の初期値は空文字なので、出力結果では見えていません。

値を代入する(初期化していない変数の場合)

初期化していない変数に値を代入してみましょう。

// 初期化していない変数の値の代入
package main

import "fmt"

func main(){
    var (
        i int
        fl64 float64
        s string
        t bool
        f bool
    )
    fmt.Println(i, fl64, s, t, f)

    i = 10
    fl64 = 1.23
    s = "Hello Golang"
    t = true
    f = false

    fmt.Println(i, fl64, s, t, f)
}
// 出力結果
$ go run main.go
0 0  false false
10 1.23 Hello Golang true false

値の再代入

変数は値を再代入することができます。

// 値の再代入
package main

import "fmt"

func main(){
    // var 変数名 型 = 値
    // 整数型int
    var i int = 1
    fmt.Println(i)

    i = 10
    fmt.Println(i)
}
// 出力結果
$ go run main.go
1
10

Go言語での変数宣言の注意点

Go言語での変数宣言で注意しなけらばいけないことが2点あります。

1.変数の再定義はできません

コード内ので使用している変数を再定義することはできません。

// 変数の再定義はできません
import "fmt"

func main() {
    var i int = 1
    fmt.Println(i)

    // 再定義してみる
    var i string = "Hello Golang"
    fmt.Println(i)
}
// 出力結果
$ go run main.go 
# command-line-arguments
./main.go:9:6: i redeclared in this block
        previous declaration at ./main.go:6:6

「goファイル中で”変数i”が重複して用いられている」というエラーになります。

2.変数に違う型の値を代入することができない

Go言語は静的型付け言語で型には厳格です。

// 変数に違う型の値を代入することができない
import "fmt"

func main() {
    var i int = 1
    fmt.Println(i)

    // int型の変数に文字列の値を代入してみる
    i = "Hello Golang"
    fmt.Println(i)
}
// 出力結果
$ go run main.go 
# command-line-arguments
./main.go:9:4: cannot use "Hello Golang" (type untyped string) as type int in assignment

「int型にはstring型の値は代入できない」というエラーになります。

宣言した変数は必ず使用しないといけない

Go言語では宣言した変数を必ず使用しなければいけません!

無駄な変数宣言はしないことです。

もりぴ
もりぴ

無駄な変数がなくなるため、プログラムがスッキリしますね。

Go言語でのvarを使用しない変数宣言(型指定の省略)

Go言語では型指定を省略して変数宣言することができます。

変数名 := 値

型を省略していますが、代入した値によって型が決定されます。

// 変数の省略宣言(型指定の省略)
package main

import "fmt"

func main() {
    xi := 1
    xfl := 2.3
    xs := "Hello Morip"
    xt, xf := true, false

    fmt.Println(xi, xfl, xs, xt, xf)
}
// 出力結果
$ go run main.go 
1 2.3 Hello Morip true false
もりぴ
もりぴ

変数宣言のvarを省略した形は楽なんですが落とし穴もあります。

【参考】変数の型を確認しよう

型が省略されて変数宣言をすると、自分は理解できていても他の人がコードを見た時に型を確認しづらい点がありまので注意が必要です。

ちょうどよい流れなので、Go言語で変数の型を確認する方法をご紹介いたします。

fmt.Printf(“%T\n”, 変数名)
%Tは型を出力する書式指定です。

いままでは Println() 関数を使用して出力してきましたが、変数の書式指定して値を出力する場合は Printf() 関数を使用します。

ここで注意しなければいけないのが Println() 関数は改行付きで出力されますが、Printf() 関数は改行は付きません。

ですから、改行したい時は \n を付け加える必要があります。

// 変数の型を調べる
package main

import "fmt"

func main() {
    xi := 1
    xfl := 2.3
    xs := "Hello Morip"
    xt, xf := true, false

    fmt.Println(xi, xfl, xs, xt, xf)

    fmt.Printf("%T\n", xi)
    fmt.Printf("%T\n", xfl)
    fmt.Printf("%T\n", xs)
    fmt.Printf("%T\n", xt)
    fmt.Printf("%T\n", xf)
}
// 出力結果
$ go run main.go 
1 2.3 Hello Morip true false
int
float64
string
bool
bool

ここで注意が必要なのがfloat型です。

float型には float32float64 があり、省略形で変数宣言した場合は float64 が選択されます。

Go言語でvarを使用しない変数宣言での注意点

変数をvarを省略した形で宣言した場合は、関数内でのみ使用でき関数外では使用できません。

// 変数の型を調べる
package main

import "fmt"

// 省略形の変数宣言を関数外で宣言
xi := 1

func main() {
    fmt.Println(xi)
    fmt.Printf("%T\n", xi)
}
// 出力結果
$ go run main.go 
# command-line-arguments
./main.go:7:1: syntax error: non-declaration statement outside function body

シンタックスエラーになり「関数の外では宣言できません」というエラーになります。

ちなみに、通常の変数宣言だと…

// 変数の型を調べる
package main

import "fmt"

// 関数外で変数宣言
var i int = 1

func main() {
    fmt.Println(i)
    fmt.Printf("%T\n", i)
}
// 出力結果
$ go run main.go 
1
int

エラーが出されずに値が出力されます。

通常の変数宣言とvarを省略した宣言の使い分け

通常の変数宣言とvarを省略した形の変数宣言の使い分けですが「あなたの好みで使用しても構わない」というのが結論なのですが、私の場合の使い分けですと…

CHECK POINT
通常の変数宣言とvarを省略した宣言の使い分け一例
  • 関数内か関数外か(関数外では通常の変数宣言を使用)
  • 制御構文(for・ifなど)で一回のみ使用する変数にはvarの省略形
  • 配列やスライスmapを生成する時

基本的には通常の変数宣言を使用しています。

ただし、いろんなサイトやGo言語教材ではfor文のカウンタ変数には、varを省略した形を用いていることが多いです。

もりぴ
もりぴ

私もコードを簡潔したい制御構文では、varを省略した形を使用します。

【まとめ】Go言語の変数宣言を理解しよう

もりぴ
もりぴ

それでは、今回の記事内容をまとめてみましょう!

この記事で覚えておくべきことのまとめ!
  • Go言語での変数宣言の2種類ある
  • 変数を複数宣言する方法がある
  • 変数を初期化しなくても宣言できる
  • Go言語は型に厳密である(再代入の時に注意)
  • Go言語の変数は再定義できない
  • Printf関数について理解

Go言語は静的型付け言語で、型指定をきちんと行うことでバグを極力おさえる設計になっています。

いま人気のPythonは動的型付け言語で、Pythonを学習してきた方にはとっつきにくい点もあったでしょうけど型指定をクリアできれば、それほど難しくなかったのではないでしょうか。

今回はGo言語の変数宣言についてまとめました。

Go言語の魅力を少しづつ理解していただければうれしいです!

comment

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