Menu
Coddy logo textTech

まとめ:連絡帳アプリ

CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 18/107。

challenge icon

チャレンジ

簡単

この章で習得したすべての概念、つまり custom type、ネストした struct、struct tag、zero value を組み合わせた contact book system を構築しましょう。

コードを2つのファイルに分けて整理します。

  • contact.go: 意味のある custom type と適切な JSON formatting を使って、contact book の data model を Define します。
    • PhoneEmailstring に基づく custom type として Create し、コードを自己文書化します
    • StreetCityCountry fields を持つ Address struct を Define し、それぞれに適切な JSON tag を付けます
    • Name(string)、Phone(あなたの Phone type)、Email(あなたの Email type)、Address(nested struct)を含む Contact struct を Define します。phoneemail が 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
}

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Goオンラインコンパイラ