回顾:通讯录
本课属于 Coddy GO 学习旅程的“面向对象编程”单元。第 18 课,共 107 课。
挑战
简单让我们来构建一个通讯录系统,综合运用自定义类型、嵌套结构体、结构体标签和零值,也就是你在这一章中掌握的所有概念。
你将把代码分成两个文件:
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 在线编译器