Help us understand the problem. What is going on with this article?

Goでポインター型のフィールドをもつ構造体の配列をforループする処理ではまった

More than 1 year has passed since last update.

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の全要素"はははは"が出力される、というロジックである。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした