Go语言统计字符串中每个字符出现的次数 — 简易频率分析器

一、 案例目标

本案例将实现一个程序,接收用户输入的一段文字,并统计其中每个字符(包括中文、英文、数字等)出现的次数,并按字符输出。

例如输入:

复制代码
Hello, 世界!

输出:

makefile 复制代码
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. 可拓展成图表/词云工具基础。

五、 完整代码实现

go 复制代码
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:

arduino 复制代码
请输入一段文字: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 和算法世界的一扇小门。

相关推荐
云妙算3 分钟前
被1600万家庭信赖的智能音箱Sonos,用什么方式让AWS云成本打3折?
后端·开源·aws
省委书记沙瑞金6 分钟前
🧪 摸鱼也能写监控大屏?用 Python + HTML 实现一个炫酷系统资源监控面板
后端
泉城老铁15 分钟前
Spring Boot整合Redis实现订单超时自动删除:从原理到实战
java·后端·架构
泉城老铁21 分钟前
Spring Boot深度整合RabbitMQ:从入门到企业级实战
java·后端·rabbitmq
雨伞弄丢在下雨天24 分钟前
释放并发潜力!Spring Boot 3.2 + Java 21 虚拟线程实战指南
后端
RainbowSea40 分钟前
安装win10出现“计算机意外的重新启动或遇到错误。Windows安装无法继续。若要安装Windows,请单击“确定”重新启动计算机,然后安装系统。”
windows·后端
CodeSheep40 分钟前
学硕停招!研究生重大变革,来了
前端·后端·程序员
lyyyuna1 小时前
一个 Ginkgo 集测优化案例
后端
甲丁1 小时前
ServBay --- MAC下集成式运行环境,下一代开发环境管理工具
后端·全栈