Go語言實現(xiàn)統(tǒng)計字符串中每個字符出現(xiàn)的次數(shù)
一、 案例目標(biāo)
本案例將實現(xiàn)一個程序,接收用戶輸入的一段文字,并統(tǒng)計其中每個字符(包括中文、英文、數(shù)字等)出現(xiàn)的次數(shù),并按字符輸出。
例如輸入:
Hello, 世界!
輸出:
H: 1
e: 1
l: 2
o: 1
,: 1
: 1
世: 1
界: 1
!: 1
二、 應(yīng)用場景舉例
- 文本分析、關(guān)鍵詞提取
- 字符頻率統(tǒng)計(用于密碼分析、數(shù)據(jù)挖掘)
- 字符畫處理(字符權(quán)重)
- AI、自然語言處理基礎(chǔ)任務(wù)之一
三、 涉及知識點講解
| 知識點 | 說明 |
|---|---|
| map[rune]int | Go 中用于統(tǒng)計頻率的典型用法 |
| rune | 支持 Unicode 字符(中文、表情、特殊符號) |
| for _, r := range str | 正確遍歷字符串每個字符(而不是每個字節(jié)) |
四、實現(xiàn)需求
- 用戶輸入任意一段文字;
- 程序逐個字符統(tǒng)計出現(xiàn)次數(shù);
- 忽略字節(jié)編碼問題,支持中文;
- 輸出格式整齊,便于查看;
- 可拓展成圖表/詞云工具基礎(chǔ)。
五、 完整代碼實現(xiàn)
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字符統(tǒng)計結(jié)果:")
for _, r := range keys {
fmt.Printf("%q: %d\n", r, counts[r])
}
}
// 統(tǒng)計字符出現(xiàn)次數(shù)
func countCharacters(s string) map[rune]int {
result := make(map[rune]int)
for _, r := range []rune(s) {
result[r]++
}
return result
}
六、運行示例
示例1:
請輸入一段文字:hello, 世界
字符統(tǒng)計結(jié)果:
'\t': 1
',': 1
'e': 1
'h': 1
'l': 2
'o': 1
'世': 1
'界': 1
'\n': 1
'\n' 和 '\t' 說明:默認(rèn)輸入帶有換行符,可根據(jù)需要清洗。
七、 核心代碼解析
| 代碼段 | 說明 |
|---|---|
| map[rune]int | 創(chuàng)建一個以字符為鍵、出現(xiàn)次數(shù)為值的映射 |
| []rune(s) | 將字符串轉(zhuǎn)為字符切片,避免中文字符拆分錯誤 |
| sort.Slice | 將輸出結(jié)果按字符順序排序 |
八、 拓展練習(xí)建議
- 排除空格或標(biāo)點,只統(tǒng)計字母與數(shù)字;
- 將結(jié)果寫入文件保存;
- 改為支持詞語統(tǒng)計(用
strings.Fields()分詞); - 輸出詞頻圖或柱狀圖(結(jié)合
github.com/olekukonko/tablewriter或 ASCII 圖表庫);
九、 常見錯誤提示
- 遍歷字符串用
[]byte:會導(dǎo)致中文字符被拆成多個 byte; - 統(tǒng)計字符時忘記使用
rune類型; - 輸出結(jié)果不排序,閱讀困難。
小結(jié)
通過這個案例,你學(xué)會了:
- 如何遍歷字符串中每一個字符(支持中文)
- 如何使用
map來進(jìn)行頻率統(tǒng)計 - 如何對統(tǒng)計結(jié)果進(jìn)行排序并美觀輸出
這是實際項目中非常有價值的一種“文本特征提取”技術(shù),是通往 NLP 和算法世界的一扇小門。
到此這篇關(guān)于Go語言實現(xiàn)統(tǒng)計字符串中每個字符出現(xiàn)的次數(shù)的文章就介紹到這了,更多相關(guān)Go統(tǒng)計字符內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言學(xué)習(xí)之new函數(shù)的用法詳解
這篇文章主要為大家詳細(xì)介紹了Go語言中new()函數(shù)的相關(guān)知識以及具體用法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下2023-05-05
Go語言學(xué)習(xí)筆記之golang操作MongoDB數(shù)據(jù)庫
MongoDB是Nosql中常用的一種數(shù)據(jù)庫,這篇文章主要給大家介紹了關(guān)于Go語言學(xué)習(xí)筆記之golang操作MongoDB數(shù)據(jù)庫的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
解決Golang小數(shù)float64在實際工程中加減乘除的精度問題
這篇文章主要介紹了解決Golang小數(shù)float64在實際工程中加減乘除的精度問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03
golang微服務(wù)框架基礎(chǔ)Gin基本路由使用詳解
這篇文章主要為大家介紹了golang微服務(wù)框架Gin基本路由的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11
Golang中實現(xiàn)數(shù)據(jù)脫敏處理的go-mask包分享
這篇文章主要是來和大家分享一個在輸出中對敏感數(shù)據(jù)進(jìn)行脫敏的工作包:go-mask,可以將敏感信息輸出的時候替換成星號或其他字符,感興趣的小編可以跟隨小編一起了解下2023-05-05
golang程序打包成腳本部署到Linux系統(tǒng)方式
Golang程序通過本地編譯(設(shè)置GOOS為linux生成無后綴二進(jìn)制文件),上傳至Linux服務(wù)器后賦權(quán)執(zhí)行,使用nohup命令實現(xiàn)后臺運行,完成自動化部署2025-07-07

