检查元素是否存在
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 34 课,共 68 课。
现在你已经可以向集合中添加元素,接下来一个重要的操作是检查集合中是否存在特定元素。这时,Go 的“逗号 ok”惯用法就非常有用了。
要检查集合中是否存在某个元素,你可以使用与检查映射中是否存在某个键相同的语法:
_, ok := colors["red"]
if ok {
fmt.Println("Red is in the set")
} else {
fmt.Println("Red is not in the set")
}这里使用下划线 _,因为我们不关心实际值(它始终是一个空结构体)。我们只关心布尔型的 ok 变量,它会告诉我们键是否存在。
你也可以直接在 if 语句中使用这种模式,让代码更简洁:
if _, exists := colors["blue"]; exists {
fmt.Println("Blue is in the set")
}这种成员测试快速而高效,利用 Go 优化过的 map 实现,为你带来真正的集合数据结构所具备的性能优势。
挑战
简单使用 Go 集合惯用法构建一个团队成员验证系统,检查特定人员是否属于项目团队。本挑战将演示如何使用 comma ok 惯用法检查某个成员是否存在于集合中。
你会收到两个输入:
- 一个字符串,包含以逗号分隔的团队成员(例如:
"Alice,Bob,Charlie,Diana,Eve") - 一个字符串,包含以逗号分隔的待检查人员(例如:
"Bob,Frank,Alice,Grace,Charlie")
你的任务是:
- 使用 Go 惯用法
map[string]struct{}创建一个集合,用来存储团队成员 - 按逗号拆分第一个输入字符串,获取每个团队成员的姓名
- 使用空结构体字面量
{}作为值,将每个团队成员添加到集合中 - 按逗号拆分第二个输入字符串,获取待验证人员的列表
- 对于每个待检查人员,使用 comma ok 惯用法
_, ok := teamSet[person]检查其是否属于集合 - 显示每位待检查人员的验证结果:
- 如果此人在团队中:
"[person] is on the team" - 如果此人不在团队中:
"[person] is not on the team"
- 如果此人在团队中:
- 检查完所有人员后,显示汇总信息:
"Team size: [team_member_count]""People checked: [people_checked_count]""Team members found: [found_count]""Non-team members: [not_found_count]"
使用 strings 包按逗号拆分输入字符串。本挑战将演示 comma ok 惯用法如何安全、高效地检查某个成员是否存在于 Go 集合中,并同时返回值和一个布尔值,以指示键是否存在。
亲手试试
package main
import (
"fmt"
"strings"
)
func main() {
// 读取输入
var teamMembersInput string
var peopleToCheckInput string
fmt.Scanln(&teamMembersInput)
fmt.Scanln(&peopleToCheckInput)
// 解析输入字符串
teamMembers := strings.Split(teamMembersInput, ",")
peopleToCheck := strings.Split(peopleToCheckInput, ",")
// TODO: 在下方编写你的代码
// 使用 map[string]struct{} 创建集合
// 将团队成员添加到集合中
// 使用逗号 ok 惯用写法检查每个人
// 显示验证结果和汇总信息
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Go 在线编译器