Golangのスコープについて

2019/02/09

はじめに

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プライムビデオでも配信してるので。早く、こんなブログ見てないで。

ちなみに僕は続きが気になって、原作漫画を全巻買ってしまいました。

Golang

時計の秒針について

ChromebookにUbuntuをインストールしようとした愚か者のお話