はじめに
Golangを書いてて詰まったことがあったのでメモです。
本文
こんな感じでカテゴリ、商品名、価格を持った構造体のスライスがあるとします。
type product struct {
category string
name string
price uint64
}
showcase := []product{
{"果物", "りんご", 120},
{"果物", "バナナ", 100},
{"果物", "みかん", 70},
{"肉", "鶏もも", 250},
{"肉", "豚バラ", 300},
{"肉", "カルビ", 450},
}
で、このスライスから果物の価格だけ10円引きします。
for _, v := range showcase {
if v.category == "果物" {
v.price -= 10
}
}
こんな感じで書いたのですが、上のfor文だとshowcase
の中身は変更されません。
変数のスコープを考えてなかったのが原因です。
変数v
はfor文の中でしか使えないので、いくらv
の中身を変更してもshowcase
の中身は変わりません。
for i := 0; i < len(showcase); i++ {
if showcase[i].category == "果物" {
showcase[i].price -= 10
}
}
上のように要素を指定して直接変更すればshowcase
の中身を変更することができます。
var showcaseNew []product
for _, v := range showcase {
if v.category == "果物" {
v.price -= 10
}
showcaseNew = append(showcaseNew, v)
}
for文の中で要素を指定して処理するなんてナウくない、という場合はこんな感じで別のスライスを用意して、各要素を追加していく方法もあります。
おわりに
なんか凄く初歩的なことで詰まってた気がします。
蛇足
2019年冬アニメでやっている約束のネバーランドが面白いです。
ネタバレをせずに感想を書く自信がないので「いいから観て!」としか書けないです。
Amazonプライムビデオでも配信してるので。早く、こんなブログ見てないで。
ちなみに僕は続きが気になって、原作漫画を全巻買ってしまいました。