开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:统计不同类型的字符个数】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9733
统计不同类型的字符个数
内容介绍
一、文件编程应用实例
二、运行代码查看结果
一、文件编程应用实例
1.统计英文、数字、空格和其他字符数量
说明:统计一个文件中含有的英文、数字、空格及其它字符数量。
2.代码实现
package main
import (
"fmt"
"os"
"io"
"buf1o"
//定义一个结构体,用于保存统计结果
type Charcount struct {
chcount int //记录英文个数
Numcount int //记录数字的个数
Spacecount int //记录空格的个数
othercount int //记录其它字符的个数|
func main(){
//思路:打开一个文件,创建一个 Reader
//每读取一行,就去统计该行有多少个英文、数字、空格和其他字符
//然后将结果保存到一个结构体
fileName ="e:/abc.txt"
file, err := os.Open(fileName)
if err != nil {
fmt.Printf("open file err=%v\n", err)
return
defer file.Close()
//定义个 charcount 实例
var count charcount
//创建一个 Reader
reader := bufio.NewReader(file)
//开始循环的读取fileName的内容
for {
str, err := reader.Readstring('\n')
if err == io.EOF{ //读到文件末尾就退出
break
}
//遍历 str ,进行统计
for _, v := range str {
fmt.Print1n(v)//测试能否打印出来
运行
D:\go project\src\go_code\chapter14\filedemo05\exe07>go run main.go
D:\go project\src\go_code\chapter14\filedemo05\exe07>
可以看到已经统计出来,数组将数字打出来。
switch v {
case v >=“a'&& v<='z’:
count.Chcount++
case v >='A'&& v<='Z':
count.Chcount++ )
(可以将上面部分做穿透处理,如下)
case v >=“a'&& v<='z’:
fallthrough //穿透
case v >='A'&& v<='Z':
count.Chcount++
case v ==' ' || v =='\t’
count.SpaceCount++
case v >='0'&& v <='9’
count.Numcount++
default:
count.Othercount++
每读一行处理一次,最终将统计结果输出
//输出统计的结果查看是否正确
fmt.Printf(“字符的个数为=%v 数字的个数为=%v 空格的个数为=%v 其它字符个数=%v",
count.chcount, count.Numcount,count.Spacecount,count.Othercount)
二、运行代码查看结果
提示出现 Error.Error.illegal value for'line'
case v ==' ' || v =='\t’
case v >='0'&& v <='9’
定位发现这两处出现问题,加上:就可以将问题解决
另一处错误是 mismatched types book and rune 不匹配 bool 类型,返回为 bool 类型,但是 v 不是 bool 类型,将switch v 中的 v 删除即可,不用 v 匹配直接将 swich 当做一组分支判断
运行
D:\go project\src\go_code\chapter14\filedemo05\exe07>go run main.go
字符的个数为=13 数字的个数为=7空格各数为=2 其他字符个数=4
D:\go project\src\go_code\chapter14\filedemo05\exe07>
打开原文件比对结果是否正确
原文件内容:
ab123 89popj\r\n
yy89 hello
完全正确(\r\n 不显示字符)
//为了兼容中文字符,可以将 str 转成[]run
str=[]run(str)