遍历集合
本课属于 Coddy GO 学习旅程的“逻辑与流程”单元。第 36 课,共 68 课。
现在你已经可以向集合中添加、检查和删除元素了,是时候学习如何遍历所有元素了。由于你的 Go 集合基于映射构建,因此你可以使用熟悉的 for...range 循环访问每个元素。
要遍历集合,可以使用与遍历映射相同的语法,但你只需要关注键:
for color := range colors {
fmt.Println(color)
}注意,我们在范围循环中只使用了一个变量。因为我们不需要这些值(它们都是空结构体),所以可以完全忽略它们。这样会逐行打印集合中的每种颜色。
如果你想明确表示要忽略这个值,也可以使用双变量形式:
for color, _ := range colors {
fmt.Println(color)
}请记住,Go 中的映射在迭代时不保证任何特定顺序,因此每次运行程序时,集合中的元素都可能以不同的顺序打印出来。这是集合的正常行为,因为集合的设计用途是测试元素是否存在,而不是保持顺序。
挑战
简单使用 Go 集合惯用写法构建一个音乐播放列表分析器,用于处理歌曲集合并显示每个播放列表的详细信息。这个挑战演示如何遍历集合来检查并报告其中的内容。
你会收到两个输入:
- 一个包含摇滚歌曲的字符串,歌曲之间用逗号分隔(例如,
"Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine") - 一个包含流行歌曲的字符串,歌曲之间用逗号分隔(例如,
"Shape of You,Blinding Lights,Watermelon Sugar,Levitating")
你的任务是:
- 使用 Go 惯用写法
map[string]struct{}创建两个集合,分别存储摇滚歌曲和流行歌曲 - 通过按逗号拆分两个输入字符串,解析出每首歌曲的标题
- 使用空结构体字面量
{}作为值,将每首歌曲添加到对应的集合中 - 显示摇滚播放列表分析:
- 标题:
"Rock Playlist Analysis:" - 数量:
"Total rock songs: [count]" - 歌曲标题:
"Songs in rock playlist:" - 每首歌曲单独占一行:
"♪ [song_title]"
- 标题:
- 显示流行播放列表分析:
- 标题:
"Pop Playlist Analysis:" - 数量:
"Total pop songs: [count]" - 歌曲标题:
"Songs in pop playlist:" - 每首歌曲单独占一行:
"♪ [song_title]"
- 标题:
- 将两个集合合并到一个新集合中,创建一个合并后的播放列表
- 显示合并后的播放列表分析:
- 标题:
"Combined Playlist Analysis:" - 数量:
"Total unique songs: [count]" - 歌曲标题:
"All songs in combined playlist:" - 每首歌曲单独占一行:
"♫ [song_title]"
- 标题:
- 最后,显示摘要:
"Playlist Summary:""Rock songs: [rock_count]""Pop songs: [pop_count]""Combined unique songs: [combined_count]"
使用 strings 库按逗号拆分输入字符串。要遍历每个集合,请使用只带一个变量的 for...range 循环,这样只会访问键(歌曲标题)。这个挑战演示了遍历 Go 集合如何让你检查集合中的所有元素,因此非常适合用于分析和报告任务。
亲手试试
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// 使用 bufio.Scanner 读取完整的行(可处理带空格的歌曲标题)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
rockSongs := scanner.Text()
scanner.Scan()
popSongs := scanner.Text()
// 使用 Go 的惯用写法 map[string]struct{} 创建集合
rockSet := make(map[string]struct{})
popSet := make(map[string]struct{})
// 解析输入字符串并填充集合
rockList := strings.Split(rockSongs, ",")
popList := strings.Split(popSongs, ",")
// TODO:在下方编写你的代码
// 将歌曲添加到各自的集合中
// 显示摇滚播放列表的分析结果(对歌曲排序,确保输出顺序一致)
// 显示流行播放列表的分析结果(对歌曲排序,确保输出顺序一致)
// 创建并显示合并后播放列表的分析结果(对歌曲排序,确保输出顺序一致)
// 显示播放列表汇总
// 记住:将 map 的键转换为切片,排序后再遍历,确保顺序一致
_ = rockSet
_ = popSet
_ = rockList
_ = popList
_ = fmt.Sprintf
_ = sort.Strings
}这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Go 在线编译器