Goには、変数の値に空やnull、undefinedといった概念はありません。 初期値を明示せずに宣言された変数は、それぞれの型のゼロ値になります。
真偽値や数値型、文字列などのプリミティブ型のゼロ値は、それぞれfalse、0、""です。
ゼロを意味する識別子nilは、ポインター、関数、インターフェース、スライス、チャネル、マップなど、より複雑な型のゼロ値です。
次の表に、Goの各型のゼロ値をまとめます。
| 型 | ゼロ値 |
|---|---|
| 真偽値 | false |
| 数値 | 0 |
| 文字列 | "" |
| ポインター | nil |
| 関数 | nil |
| インターフェース | nil |
| スライス | nil |
| チャネル | nil |
| マップ | nil |
上の表に構造体の型がないことにお気づきかもしれません。 これは、構造体の型のゼロ値がそのフィールドによって決まるためです。 構造体は、そのすべてのフィールドがそれぞれのゼロ値になると、ゼロ値になります。
これから行われる国勢調査に向けて、市のITシステムを準備するのが仕事です。 具体的には、国勢調査員が集めたデータを処理するプログラムを担当します。
このプログラムは、住民の情報を受け取ると、システムに新しい住民を作成できる必要があります。 さらに、住民のデータに必要な情報がそろっているかを確認する関数と、住民のデータを削除する関数を作成します。 最後に、正確な国勢調査の集計結果を出すために、住民の数を数えます。
国勢調査員が住民の情報を集めるときは、その住民の名前、年齢、住所をシステムに入力して登録する必要があります。
3つの引数を受け取るNewResident関数を実装してください。
この関数は、この情報を保持するResident構造体へのポインターを返すようにします。
name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}
NewResident(name, age, address)
// => &{Matthew Sanabria 29 map[street:Main St.]}
住民は、国勢調査員に個人情報を提供したがらないことがあります。 そのような場合は、その住民が国勢調査で数えられるための必須情報を提供したかどうかを判定する必要があります。
数えられるためには、住民は名前と、住所のstreetキーに、それぞれゼロ値以外の値を設定している必要があります。
住民の年齢など、その他の情報はすべて任意です。
住民が必須情報を提供しているかどうかを示す真偽値を返すHasRequiredInfoメソッドを実装してください。
name := "Matthew Sanabria"
age := 0
address := make(map[string]string)
resident := NewResident(name, age, address)
resident.HasRequiredInfo()
// => false
人生は慌ただしく、間違いはつきものです。 住民が市の外へ引っ越すこともあります。 国勢調査員がデータを集めるときに間違いを犯すこともあります。 そのような場合は、その住民が数えられないように、住民のデータを削除できる必要があります。
住民のすべてのフィールドをゼロ値に設定するDeleteメソッドを実装してください。
name := "Matthew Sanabria"
age := 29
address := map[string]string{"street": "Main St."}
resident := NewResident(name, age, address)
fmt.Println(resident)
// Output: &{Matthew Sanabria 29 map[street:Main St.]}
resident.Delete()
fmt.Println(resident)
// Output: &{ 0 map[]}
システムが国勢調査のデータに対応したので、いよいよ国勢調査を実施して住民を数えましょう!
1つの引数を受け取るCount関数を実装してください。
Resident構造体へのポインターのスライス。この関数は、国勢調査で数えられた住民の数を示す整数を返すようにします。 住民は、国勢調査員に必須情報を提供した場合にのみ数えられます。
name1 := "Matthew Sanabria"
age1 := 29
address1 := map[string]string{"street": "Main St."}
resident1 := NewResident(name1, age1, address1)
name2 := "Rob Pike"
age2 := 0
address2 := make(map[string]string)
resident2 := NewResident(name2, age2, address2)
residents := []*Resident{resident1, resident2}
Count(residents)
// => 1