kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

golangのループ中のパラメータの値変更の書き方

golangのループで値を変える場合の書き方を改善するきっかけの記事にしようかと思い書いてみます。

いままでの書き方

type Sample struct {
    Number int64
}

func main() {
    tmp := make([]Sample, 20)

    for k, v := range tmp {
        v.Number += int64(k)
    }
    fmt.Println(tmp)

    for k := range tmp {
        tmp[k].Number += int64(k)
    }
    fmt.Println(tmp)
}
[{0} {0} {0} {0} {0} {0} {0} {0} {0} {0} {0} {0} {0} {0} {0} {0} {0} {0} {0} {0}]
[{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19}]

rangeでの記述が好みで書いていましたが、ループで値を変えようとすると、「tmp[k]」みたいに書く必要があるんですね。長い。

やっぱりポインタで書き換えたい。

書き方1

type Sample struct {
    Number int64
}

func main() {
    tmp := make([]Sample, 20)

    for i := 0; i < len(tmp); i++ {
        v := &tmp[i]
        v.Number = int64(i)
    }
    fmt.Println(tmp)
}
[{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19}]

一緒かな。

書き方2

type Sample struct {
    Number int64
}

func main() {
    tmp := make([]Sample, 20)

    for k := range tmp {
        v := &tmp[k]
        v.Number = int64(k)
    }
    fmt.Println(tmp)
}
[{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} {18} {19}]

行数増えるけど、個人的にこれかな。