向集合添加元素
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 33 课,共 68 课。
现在你已经创建了一个集合,下一步是学习如何向其中添加元素。由于 Go 集合实际上底层是一个映射,因此向集合添加元素和向映射添加键完全相同。
要向集合中添加元素,只需将空结构体值赋给一个新键:
colors["yellow"] = struct{}{}struct{}{} 语法会创建一个空结构体字面量。第一个 struct{} 指定类型,第二个 {} 对其进行初始化。这是在 Go 中向集合添加元素的标准方式。
这种方法的好处是,如果你再次尝试添加相同的元素,它只会覆盖现有条目,从而保持集合的唯一性。
请注意,struct{}{} 是此赋值唯一有效的语法:只写 {} 而不写类型名称会导致编译错误:复合字面量缺少类型。在映射字面量之外为映射键赋值时,必须始终明确提供类型。
向集合中添加元素既快速又简单,它利用了 Go 高效的 map 实现,同时提供真正的集合行为,便于你跟踪不重复的项。
挑战
简单使用 Go 集合惯用法构建一个技能跟踪系统,用于管理开发者的技术能力。这个挑战将演示如何向集合中添加新技能,同时避免重复并跟踪学习进度。
你将收到两个输入:
- 一个表示预期技能数量的字符串(例如,
"5"),仅供参考 - 一个字符串,其中包含以逗号分隔的技能(例如,
"Go,Docker,Kubernetes,Go,React,Docker,Python")
你的任务是:
- 使用 Go 惯用法
map[string]struct{}创建一个集合,用来存储不重复的技术技能 - 使用三个初始技能初始化集合:
"Programming"、"Problem Solving"和"Communication" - 通过按逗号拆分输入字符串,解析出各个技能名称
- 处理逗号分隔字符串中的 ALL 个技能(遍历整个切片,不使用数量参数)
- 对于输入中的每项技能,使用
struct{}{}作为值将其添加到集合中 - 打印每项技能的处理结果,以显示处理进度:
- 如果该技能是集合中的新技能:
"Learning new skill: [skill]" - 如果该技能已存在于集合中:
"Already mastered: [skill]"
- 如果该技能是集合中的新技能:
- 处理完所有技能后,显示进度摘要:
"Skills processed: [total_processed]",使用技能切片的长度"New skills learned: [new_skills_count]""Total skills mastered: [total_unique_skills]"
- 最后,列出开发者技能集合中的所有技能:
- 标题:
"Complete skill set:" - 每项技能单独占一行:
"✓ [skill]"
- 标题:
重要:使用 range 遍历切片中的所有技能,而不是使用数量参数。数量仅供参考,不应控制循环。使用 strings 包拆分输入字符串。要在添加技能前检查它是否已存在,请使用逗号 ok 惯用法:_, exists := skillSet[skill]。这个挑战将演示向 Go 集合中添加元素时如何自动处理唯一性,同时为成员资格检查提供快速查找性能。
亲手试试
package main
import (
"fmt"
"sort"
"strconv"
"strings"
)
func main() {
// 读取输入
var countStr string
var skillsStr string
fmt.Scanln(&countStr)
fmt.Scanln(&skillsStr)
// 将计数字符串转换为整数(仅供参考,不在循环中使用)
_, _ = strconv.Atoi(countStr)
// 用初始技能初始化技能集合
skillSet := map[string]struct{}{
"Programming": struct{}{},
"Problem Solving": struct{}{},
"Communication": struct{}{},
}
// 将技能字符串拆分成单个技能
skills := strings.Split(skillsStr, ",")
// TODO:在下方编写你的代码
// 使用 range 遍历切片中的所有技能,逐一处理
// 使用 comma ok 写法:_, exists := skillSet[skill]
// 使用 skillSet[skill] = struct{}{} 添加新技能
// 显示每项技能的处理结果
// 使用 len(skills) 计算并显示进度汇总
// 列出完整技能集合中的所有技能(考虑排序,以确保输出顺序一致)
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Go 在线编译器