Menu
CoddyTech

回顾:通讯录

本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 18 课,共 107 课。

challenge icon

挑战

简单

让我们来构建一个通讯录系统,综合运用自定义类型、嵌套结构体、结构体标签和零值,也就是你在这一章中掌握的所有概念。

你将把代码分成两个文件:

  • contact.go:定义通讯录数据模型,使用有意义的自定义类型和恰当的 JSON 格式:
    • 基于 string 创建自定义类型 Phone 和 Email,让代码更容易理解
    • 定义一个 Address 结构体,包含 Street、City 和 Country 字段,并为每个字段添加合适的 JSON 标签
    • 定义一个 Contact 结构体,包含 Name(string)、Phone(你的 Phone 类型)、Email(你的 Email 类型)和 Address(嵌套结构体)。使用 JSON 标签,让值为空时省略 phone 和 email
  • main.go:从输入中读取联系人信息,创建一个 Contact 实例,并将其以格式化的 JSON 输出。有些联系人的信息可能不完整:让零值和 omitempty 妥善处理这些情况。

将提供以下输入:

  • 第 1 行:联系人姓名
  • 第 2 行:电话号码(可能为空)
  • 第 3 行:电子邮件地址(可能为空)
  • 第 4 行:街道地址
  • 第 5 行:城市
  • 第 6 行:国家

使用 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)

	// 读取 name
	scanner.Scan()
	name := scanner.Text()

	// 读取 phone(可能为空)
	scanner.Scan()
	phone := scanner.Text()

	// 读取 email(可能为空)
	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 类型
	// 创建嵌套的 Address 结构体,包含 street、city 和 country

	// TODO:使用 json.MarshalIndent 将 contact 转换为 JSON
	// 使用 "" 作为前缀,使用 "  "(两个空格)作为缩进

	// TODO:输出 JSON 字符串
	_ = name
	_ = phone
	_ = email
	_ = street
	_ = city
	_ = country
}

面向对象编程中的所有课

自己练习: Go 在线编译器