hakeの日記

Windows環境でプログラミングの勉強をしています。

Go言語 - 省略書式の変数宣言とスコープで悩んだ点(Go1.5)

以下のプログラムでは、forブロックの中で関数hogeの戻り値を取得しています。
このとき変数 err が初めて登場したため ' = ' ではなく ' := ' を使用したのですが、こうすると変数aもforブロック内のローカル変数と判断されてしまいます。このため、ループ条件で使用している(ローカル変数ではない)aの値が変更されなくなって、forブロックから抜け出すことができません。

package main

import "fmt"

func hoge() (string, error){
    return "bar", nil
} 

func main() {
    var a string = "foo"

    fmt.Println(a)           //-> foo
    for a == "foo" {         // 無限ループになる(ここのaが変更されない)
        a, err := hoge()
        fmt.Println(a, err)  //-> bar <nil> // aには関数の戻り値が代入されている
    }
    fmt.Println(a)
}

対処法

errを事前に宣言しておき、関数の戻り値は'='で受ける。

    var err error           // 予め宣言しておく
    for a == "foo" {
        a, err = hoge()     //  '='を使用
        fmt.Println(a, err)
    }