Menu
CoddyTech

Ôn tập: sổ liên lạc

Thuộc phần Lập trình hướng đối tượng trong hành trình GO của Coddy. Bài học 18 trên 107.

challenge icon

Thử thách

Dễ

Hãy xây dựng một hệ thống sổ liên lạc kết hợp các kiểu tùy chỉnh, struct lồng nhau, thẻ struct và giá trị zero, tức là tất cả các khái niệm bạn đã nắm vững trong chương này.

Bạn sẽ sắp xếp code trong hai tệp:

  • contact.go: Định nghĩa mô hình dữ liệu sổ liên lạc với các kiểu tùy chỉnh có ý nghĩa và định dạng JSON phù hợp:
    • Tạo các kiểu tùy chỉnh Phone và Email dựa trên string để code tự mô tả
    • Định nghĩa struct Address với các trường Street, City và Country, mỗi trường có thẻ JSON phù hợp
    • Định nghĩa struct Contact gồm Name (string), Phone (kiểu Phone của bạn), Email (kiểu Email của bạn) và Address (struct lồng nhau). Dùng thẻ JSON để bỏ qua phone và email nếu chúng trống
  • main.go: Đọc thông tin liên lạc từ đầu vào, tạo một đối tượng Contact và xuất dữ liệu dưới dạng JSON có định dạng. Một số liên hệ có thể thiếu thông tin: hãy để các giá trị zero và omitempty xử lý những trường hợp đó một cách phù hợp.

Đầu vào sẽ gồm:

  • Dòng 1: Tên liên hệ
  • Dòng 2: Số điện thoại (có thể để trống)
  • Dòng 3: Địa chỉ email (có thể để trống)
  • Dòng 4: Địa chỉ đường phố
  • Dòng 5: Thành phố
  • Dòng 6: Quốc gia

Dùng json.MarshalIndent với hai dấu cách để thụt lề. In ra chuỗi JSON kết quả.

Ví dụ, nếu đầu vào là một liên hệ có tên Alice Smith, không có số điện thoại, email alice@example.com, địa chỉ đường phố 123 Main St, thành phố Boston và quốc gia USA, đầu ra sẽ trông như sau:

{
  "name": "Alice Smith",
  "email": "alice@example.com",
  "address": {
    "street": "123 Main St",
    "city": "Boston",
    "country": "USA"
  }
}

Hãy chú ý rằng trường phone hoàn toàn không xuất hiện vì trường này để trống: đó là tác dụng của thẻ omitempty!

Tự làm thử

package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	// Đọc tên
	scanner.Scan()
	name := scanner.Text()

	// Đọc số điện thoại (có thể để trống)
	scanner.Scan()
	phone := scanner.Text()

	// Đọc email (có thể để trống)
	scanner.Scan()
	email := scanner.Text()

	// Đọc tên đường
	scanner.Scan()
	street := scanner.Text()

	// Đọc thành phố
	scanner.Scan()
	city := scanner.Text()

	// Đọc quốc gia
	scanner.Scan()
	country := scanner.Text()

	// TODO: Tạo một instance Contact bằng các giá trị đầu vào
	// Dùng các kiểu dữ liệu tùy chỉnh Phone và Email cho các trường tương ứng
	// Tạo struct Address lồng nhau với street, city và country

	// TODO: Dùng json.MarshalIndent để chuyển contact thành JSON
	// Dùng "" làm tiền tố và "  " (hai dấu cách) để thụt lề

	// TODO: In ra chuỗi JSON
	_ = name
	_ = phone
	_ = email
	_ = street
	_ = city
	_ = country
}

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch Go online