構造体
バラバラの変数をまとめる
ここまで、商品を扱うのに並びを3つ渡してきました。
Go
func searchSummary(names []string, prices []int, categories []string, keyword string) string無理があります。同じ添字が同じ商品を指すという約束が、コードのどこにも書かれていません。長さがずれたら壊れますし、渡す順番を間違えても気づけません。
1つの型にまとめます。
Go
type Item struct {
Name string
Price int
Category string
}type 名前 struct { ... } で、新しい型を作ります。これが構造体です。
関数の見た目が変わる
Go
func searchSummary(items []Item, keyword string) string並びが1つになりました。長さのずれが起こりえません。第6章のつくる回で、実際にこの形へ書き換えます。
フィールド名は大文字で始める
Go
type Item struct {
Name string // 外から見える
price int // このパッケージの中だけ
}第4章の関数と同じ規則です。1文字目が大文字なら公開されます。
入門のうちは全部大文字で始めておいて構いません。第8章で JSON に変換するとき、小文字始まりのフィールドは出力されないので、そこで効いてきます。
型を作るということ
Item は int や string と同じ、れっきとした型です。
Go
var item Item // ゼロ値で作られる
items := []Item{} // Item のスライス
func process(i Item) Item // 引数にも戻り値にも使えるゼロ値もあります。各フィールドがそれぞれのゼロ値になります。
Go
var item Item
// item.Name は ""、item.Price は 0、item.Category は ""第2章のゼロ値が、そのまま構造体にも効いています。宣言しただけで使える状態になっている、という一貫性です。
クラスとは違う
Go に class はありません。構造体はデータをまとめるだけで、継承もありません。
振る舞いは、次の次のレッスンでやるメソッドとして、型に後から付けます。データと振る舞いが分かれているのが、Go の設計です。
要件
type Item structで3つのフィールドを定義する- フィールド名は Name・Price・Category とし、大文字で始める
- 受け取った値から
Itemを作る 商品名 価格円 [カテゴリ]の形を返す
入出力例
itemInfo("きのこ図鑑", 1200, "本") → "きのこ図鑑 1200円 [本]"
itemInfo("中古スマホ", 24800, "家電") → "中古スマホ 24800円 [家電]"
itemInfo("おまけ", 0, "その他") → "おまけ 0円 [その他]"ヒント
編集 ゆめさく編集部