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

简介: 本案例实现一个字符统计程序,支持中文、英文及数字,可统计用户输入文本中各字符的出现次数,并以整洁格式输出。内容涵盖应用场景、知识点讲解、代码实现与拓展练习,适合学习文本分析及Go语言基础编程。

 

一、 案例目标

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

例如输入:

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. 1. 用户输入任意一段文字;
  2. 2. 程序逐个字符统计出现次数;
  3. 3. 忽略字节编码问题,支持中文;
  4. 4. 输出格式整齐,便于查看;
  5. 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. 1. ✅ 排除空格或标点,只统计字母与数字;
  2. 2. ✅ 将结果写入文件保存;
  3. 3. ✅ 改为支持词语统计(用 strings.Fields() 分词);
  4. 4. ✅ 输出词频图或柱状图(结合 github.com/olekukonko/tablewriter 或 ASCII 图表库);

九、 常见错误提示

  • • ❌ 遍历字符串用 []byte:会导致中文字符被拆成多个 byte;
  • • ❌ 统计字符时忘记使用 rune 类型;
  • • ❌ 输出结果不排序,阅读困难。

小结

通过这个案例,你学会了:

  • • 如何遍历字符串中每一个字符(支持中文)
  • • 如何使用 map 来进行频率统计
  • • 如何对统计结果进行排序并美观输出

这是实际项目中非常有价值的一种“文本特征提取”技术,是通往 NLP 和算法世界的一扇小门。

 

相关文章
|
11月前
|
存储 Go 索引
go语言中遍历字符串
go语言中遍历字符串
175 5
|
6月前
|
Go 索引
【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 394:字符串解码。题目要求对编码字符串如 `k[encoded_string]` 进行解码,其中 `encoded_string` 需重复 `k` 次。文章提供了两种解法:使用栈模拟和递归 DFS,并附有 Go 语言实现代码。栈解法通过数字栈与字符串栈记录状态,适合迭代;递归解法则利用函数调用处理嵌套结构,代码更简洁。两者时间复杂度均为 O(n),但递归需注意栈深度问题。文章还总结了解题注意事项及适用场景,帮助读者更好地掌握字符串嵌套解析技巧。
163 6
|
7月前
|
存储 机器学习/深度学习 缓存
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
214 11
|
10月前
|
Go
go语言for 遍历字符串
go语言for 遍历字符串
144 8
|
11月前
|
Go 索引
go语言遍历字符串
go语言遍历字符串
203 3
|
11月前
|
Go 索引
go语言按字符(Rune)遍历
go语言按字符(Rune)遍历
178 3
Go字节数组与字符串相互转换
Go字节数组与字符串相互转换
220 3
|
存储 Go
go语言字符串变小写
go语言字符串变小写
|
Go 开发者
|
7天前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
56 1

热门文章

最新文章