まとめ:連絡帳アプリ
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 18/107。
チャレンジ
簡単この章で学んだカスタム型、ネストされた構造体、構造体タグ、そしてゼロ値といったすべての概念を組み合わせた、連絡先管理システムを構築しましょう。
コードは2つのファイルに分けて構成します:
contact.go: 意味のあるカスタム型と適切なJSONフォーマットを使用して、連絡先帳のデータモデルを定義します:- コードの自己文書化を促進するために、
stringをベースにしたカスタム型PhoneとEmailを作成します。 Street、City、Countryフィールドを持つAddress構造体を定義し、それぞれに適切なJSONタグを付与します。Name(string)、Phone(作成した Phone 型)、Email(作成した Email 型)、およびAddress(ネストされた構造体) を含むContact構造体を定義します。phoneとemailが空の場合は出力されないようにJSONタグを使用してください。
- コードの自己文書化を促進するために、
main.go: 入力から連絡先情報を読み取り、Contact インスタンスを作成し、フォーマットされたJSONとして出力します。一部の連絡先には不足している情報があるかもしれませんが、ゼロ値とomitemptyを使って適切に処理してください。
以下の入力が提供されます:
- 1行目: 連絡先名
- 2行目: 電話番号(空の場合あり)
- 3行目: メールアドレス(空の場合あり)
- 4行目: 通り(Street address)
- 5行目: 市(City)
- 6行目: 国(Country)
インデントには2つのスペースを使用し、json.MarshalIndent を使用してください。結果のJSON文字列を出力します。
例えば、名前が Alice Smith、電話番号なし、メールが alice@example.com、通りが 123 Main St、市が Boston、国が USA の連絡先が与えられた場合、出力は以下のようになります:
{
"name": "Alice Smith",
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "Boston",
"country": "USA"
}
}電話番号が空だったため、phone フィールドが全く表示されていないことに注目してください。これが omitempty タグの効果です!
自分で試してみよう
package main
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// 名前を読み込む
scanner.Scan()
name := scanner.Text()
// 電話番号を読み込む(空の場合あり)
scanner.Scan()
phone := scanner.Text()
// メールアドレスを読み込む(空の場合あり)
scanner.Scan()
email := scanner.Text()
// 通り(street)を読み込む
scanner.Scan()
street := scanner.Text()
// 市区町村(city)を読み込む
scanner.Scan()
city := scanner.Text()
// 国(country)を読み込む
scanner.Scan()
country := scanner.Text()
// TODO: 入力値を使用して Contact インスタンスを作成する
// 各フィールドにカスタム型の Phone と Email を使用する
// street、city、country を持つネストされた Address 構造体を作成する
// TODO: json.MarshalIndent を使用して contact を JSON に変換する
// 接頭辞に "" を、インデントに " "(スペース2つ)を使用する
// TODO: JSON 文字列を出力する
_ = name
_ = phone
_ = email
_ = street
_ = city
_ = country
}
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー