在Go语言学习中,WordCount是一个经典练习,目标是统计一段文本里每个单词出现的次数。它既能帮我们熟悉字符串处理,也能理解map这种键值结构的用法。下面直接看实现思路与代码。

基本思路
核心步骤是先按空白符把文本拆成单词,再统一转小写并去掉标点,最后用map[string]int记录频率。Go标准库的strings和regexp包足以完成这些工作。
使用strings.Fields切分
strings.Fields会根据空白字符(空格、换行等)将字符串切成[]string,比手动写循环更简单。
用map计数
声明一个map[string]int,每读到一个单词就在对应键上加一。若键不存在,Go会自动初始化为0再相加。
完整示例代码
下面给出一个处理英文文本的WordCount函数,支持忽略大小写并剔除常见标点:
package main
import (
"fmt"
"regexp"
"strings"
)
// WordCount 统计文本中单词出现频率
func WordCount(text string) map[string]int {
result := make(map[string]int)
// 使用正则把非字母数字替换为空,保留单词基本字符
reg := regexp.MustCompile(`[^a-zA-Z0-9]+`)
fields := strings.Fields(text)
for _, word := range fields {
clean := reg.ReplaceAllString(strings.ToLower(word), "")
if clean == "" {
continue
}
result[clean]++
}
return result
}
func main() {
s := "Hello world! Hello Go. World of Go."
counts := WordCount(s)
for w, c := range counts {
fmt.Printf("%s: %dn", w, c)
}
}
注意事项
- 英文缩写如don't会被正则拆成don和t,实际项目可用更细的正则保留撇号。
- 中文分词不能用strings.Fields,需要借助分词库。
- map遍历顺序随机,若需按频率排序要另写切片排序逻辑。
小结
通过这个练习,我们掌握了Go里字符串清洗、切片遍历以及map计数的配合方式。把WordCount写成纯函数也方便做单元测试,是巩固基础的好起点。