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) }