定数とiota
変わらない値には const
手数料率のように、プログラムの途中で変わってほしくない値があります。
Go
const FeeRate = 0.1const で作った値は、後から書き換えられません。
Go
FeeRate = 0.2 // エラー: cannot assign to FeeRate書き換える気が無いことをコードで宣言できます。読む人は「この値はどこかで変わるかも」と疑わなくて済みます。
var との違い
Go
var rate = 0.1 // 後から変えられる
const rate = 0.1 // 変えられない迷ったら、まず const で書いてみてください。変える必要が出たときにコンパイラが教えてくれます。逆は教えてくれません。
まとめて定義する
Go
const (
FeeRate = 0.1
MaxPrice = 1000000
ServiceName = "fleama"
)設定値をまとめておくと、変更するとき1か所を見れば済みます。
iota で連番を作る
商品の状態のように、種類を表す値を作りたいことがあります。
Go
const (
StatusDraft = 0
StatusOnSale = 1
StatusSoldOut = 2
)数字を手で書くと、途中に1つ足したときに全部ずれます。これを自動にするのが iota です。
Go
const (
StatusDraft = iota // 0
StatusOnSale // 1
StatusSoldOut // 2
)iota は const のまとまりの中で 0 から始まり、1行ごとに1ずつ増えます。2行目からは書かなくても続きます。
途中に足しても、番号は自動でずれてくれます。
Go
const (
StatusDraft = iota // 0
StatusReview // 1 ← 足した
StatusOnSale // 2 自動でずれる
StatusSoldOut // 3
)数字のままでは読みにくい
iota で作るのは数字なので、そのまま表示しても意味が分かりません。
プレーンテキスト
状態: 2人が読む形に直す関数を用意するのが定番です。
Go
func statusLabel(status int) string {
switch status {
case StatusDraft:
return "下書き"
}
...
}case 0: ではなく case StatusDraft: と書けるのが、定数を用意した効き目です。0 が何を指すのか、読んだ人が調べずに済みます。
要件
constのまとまりの中でiotaを使い、StatusDraft・StatusOnSale・StatusSoldOut を定義する0を渡したら下書き、1なら販売中、2なら売切れを返す- それ以外の数値には
不明を返す switchのcaseには数字ではなく定数名を書く
入出力例
statusLabel(0) → "下書き"
statusLabel(1) → "販売中"
statusLabel(2) → "売切れ"
statusLabel(9) → "不明"ヒント
編集 ゆめさく編集部