JsonファイルをGoで処理するときにnull値と空文字との区別をしたいため、string型のポインター型のフィールド入った構造体を作って、その構造体の配列をfor文で回す処理を書いた。
このときはまったのが、単純にいえば、下のようなコードを実行したとき
package main
import "fmt"
// Hoge struct for test
type Hoge struct {
Foo *string `json:foo`
}
func main() {
var hoges [4]Hoge
values := []string{"君", "の", "名", "は"}
for i, value := range values {
// v := value
// hoges[i].Foo = &v
// 下の1行を結局上記2行に書き換えたら問題が直った。
hoges[i].Foo = &value
}
for _, hoge := range hoges {
fmt.Print(*hoge.Foo)
fmt.Print(" ")
}
}
"君の名は"が出力されると思いきや"はははは"が出力されることだ。実行例
hoge
がfor文全体に共通する変数であり、最終的にはhoges[i].Foo(i=0,1,2,3)
を示すポインターのアドレスがすべて"は"を示すアドレスになり、結果hogesの全要素"はははは"が出力される、というロジックである。