一、 案例目标
本案例将实现一个程序,接收用户输入的一段文字,并统计其中每个字符(包括中文、英文、数字等)出现的次数,并按字符输出。
例如输入:
Hello, 世界!
输出:
H: 1 e: 1 l: 2 o: 1 ,: 1 : 1 世: 1 界: 1 !: 1
二、 应用场景举例
- • 文本分析、关键词提取
- • 字符频率统计(用于密码分析、数据挖掘)
- • 字符画处理(字符权重)
- • AI、自然语言处理基础任务之一
三、 涉及知识点讲解
知识点 | 说明 |
map[rune]int |
Go 中用于统计频率的典型用法 |
rune |
支持 Unicode 字符(中文、表情、特殊符号) |
for _, r := range str |
正确遍历字符串每个字符(而不是每个字节) |
四、🛠 实现需求
- 1. 用户输入任意一段文字;
- 2. 程序逐个字符统计出现次数;
- 3. 忽略字节编码问题,支持中文;
- 4. 输出格式整齐,便于查看;
- 5. 可拓展成图表/词云工具基础。
五、 完整代码实现
package main import ( "bufio" "fmt" "os" "sort" ) func main() { reader := bufio.NewReader(os.Stdin) fmt.Print("请输入一段文字:") input, _ := reader.ReadString('\n') counts := countCharacters(input) // 排序输出 var keys []rune for k := range counts { keys = append(keys, k) } sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) fmt.Println("\n字符统计结果:") for _, r := range keys { fmt.Printf("%q: %d\n", r, counts[r]) } } // 统计字符出现次数 func countCharacters(s string) map[rune]int { result := make(map[rune]int) for _, r := range []rune(s) { result[r]++ } return result }
六、📊 运行示例
示例1:
请输入一段文字:hello, 世界 字符统计结果: '\t': 1 ',': 1 'e': 1 'h': 1 'l': 2 'o': 1 '世': 1 '界': 1 '\n': 1
'\n'
和'\t'
说明:默认输入带有换行符,可根据需要清洗。
七、 核心代码解析
代码段 | 说明 |
map[rune]int |
创建一个以字符为键、出现次数为值的映射 |
[]rune(s) |
将字符串转为字符切片,避免中文字符拆分错误 |
sort.Slice |
将输出结果按字符顺序排序 |
八、 拓展练习建议
- 1. ✅ 排除空格或标点,只统计字母与数字;
- 2. ✅ 将结果写入文件保存;
- 3. ✅ 改为支持词语统计(用
strings.Fields()
分词); - 4. ✅ 输出词频图或柱状图(结合
github.com/olekukonko/tablewriter
或 ASCII 图表库);
九、 常见错误提示
- • ❌ 遍历字符串用
[]byte
:会导致中文字符被拆成多个 byte; - • ❌ 统计字符时忘记使用
rune
类型; - • ❌ 输出结果不排序,阅读困难。
小结
通过这个案例,你学会了:
- • 如何遍历字符串中每一个字符(支持中文)
- • 如何使用
map
来进行频率统计 - • 如何对统计结果进行排序并美观输出
这是实际项目中非常有价值的一种“文本特征提取”技术,是通往 NLP 和算法世界的一扇小门。