まとめ:連絡帳アプリ
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 18/107。
チャレンジ
簡単この章で習得したすべての概念、つまり custom type、ネストした struct、struct tag、zero value を組み合わせた contact book system を構築しましょう。
コードを2つのファイルに分けて整理します。
contact.go: 意味のある custom type と適切な JSON formatting を使って、contact book の data model を Define します。PhoneとEmailをstringに基づく custom type として Create し、コードを自己文書化しますStreet、City、Countryfields を持つAddressstruct を Define し、それぞれに適切な JSON tag を付けますName(string)、Phone(あなたの Phone type)、Email(あなたの Email type)、Address(nested struct)を含むContactstruct を Define します。phoneとemailが empty の場合に省略されるよう、JSON tag を使用します
main.go: input から contact information を Read し、Contact instance を Create して、formatted JSON として出力します。一部の contact には incomplete information が含まれる may あります。zero value とomitemptyに適切に処理させましょう。
次の input が提供されます。
- Line 1: Contact name
- Line 2: Phone number(may be empty)
- Line 3: Email address(may be empty)
- Line 4: Street address
- Line 5: City
- Line 6: Country
インデントに two spaces を使用して json.MarshalIndent を使います。結果の JSON string を Print します。
たとえば、name が Alice Smith、phone がなく、email が alice@example.com、street が 123 Main St、city が Boston、country が USA の contact が与えられた場合、出力は次のようになります。
{
"name": "Alice Smith",
"email": "alice@example.com",
"address": {
"street": "123 Main St",
"city": "Boston",
"country": "USA"
}
}phone が empty だったため、その field がまったく表示されていないことに注目してください。これが omitempty tag の働きです。
自分で試してみよう
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()
// 通りを読み取る
scanner.Scan()
street := scanner.Text()
// 都市を読み取る
scanner.Scan()
city := scanner.Text()
// 国を読み取る
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復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ