Menu
CoddyTech

向集合添加元素

本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 33 课,共 68 课。

现在你已经创建了一个集合,下一步是学习如何向其中添加元素。由于 Go 集合实际上底层是一个映射,因此向集合添加元素和向映射添加键完全相同。

要向集合中添加元素,只需将空结构体值赋给一个新键:

colors["yellow"] = struct{}{}

struct{}{} 语法会创建一个空结构体字面量。第一个 struct{} 指定类型,第二个 {} 对其进行初始化。这是在 Go 中向集合添加元素的标准方式。

这种方法的好处是,如果你再次尝试添加相同的元素,它只会覆盖现有条目,从而保持集合的唯一性。

请注意,struct{}{} 是此赋值唯一有效的语法:只写 {} 而不写类型名称会导致编译错误:复合字面量缺少类型。在映射字面量之外为映射键赋值时,必须始终明确提供类型。

向集合中添加元素既快速又简单,它利用了 Go 高效的 map 实现,同时提供真正的集合行为,便于你跟踪不重复的项。

challenge icon

挑战

简单

使用 Go 集合惯用法构建一个技能跟踪系统,用于管理开发者的技术能力。这个挑战将演示如何向集合中添加新技能,同时避免重复并跟踪学习进度。

你将收到两个输入:

  • 一个表示预期技能数量的字符串(例如,"5"),仅供参考
  • 一个字符串,其中包含以逗号分隔的技能(例如,"Go,Docker,Kubernetes,Go,React,Docker,Python")

你的任务是:

  1. 使用 Go 惯用法 map[string]struct{} 创建一个集合,用来存储不重复的技术技能
  2. 使用三个初始技能初始化集合:"Programming"、"Problem Solving" 和 "Communication"
  3. 通过按逗号拆分输入字符串,解析出各个技能名称
  4. 处理逗号分隔字符串中的 ALL 个技能(遍历整个切片,不使用数量参数)
  5. 对于输入中的每项技能,使用 struct{}{} 作为值将其添加到集合中
  6. 打印每项技能的处理结果,以显示处理进度:
    • 如果该技能是集合中的新技能:"Learning new skill: [skill]"
    • 如果该技能已存在于集合中:"Already mastered: [skill]"
  7. 处理完所有技能后,显示进度摘要:
    • "Skills processed: [total_processed]",使用技能切片的长度
    • "New skills learned: [new_skills_count]"
    • "Total skills mastered: [total_unique_skills]"
  8. 最后,列出开发者技能集合中的所有技能:
    • 标题:"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) 计算并显示进度汇总
	// 列出完整技能集合中的所有技能(考虑排序,以确保输出顺序一致)
	
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Go 在线编译器