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