0

0

如何在Golang中制作一个简单的代码行数统计器 Go语言递归与匹配

P粉602998670

P粉602998670

发布时间:2026-03-11 13:40:32

|

717人浏览过

|

来源于php中文网

原创

filepath.walk 是遍历源码目录最稳方案,自动处理符号链接、权限错误和深度限制;应过滤非普通文件、用 filepath.base 配合字符串判断 go 文件、跳过测试/生成文件;逐行扫描时需跟踪多行注释状态并剔除空行和注释行;统计标准需明确定义以避免结果偏差。

如何在golang中制作一个简单的代码行数统计器 go语言递归与匹配

filepath.Walk 递归遍历源码目录最稳

Go 标准库的 filepath.Walk 是处理文件树的首选,它自动处理符号链接、权限错误和路径深度,比手写递归更可靠。手动用 os.ReadDir + 递归容易漏掉 io.EOFpermission denied 场景,导致统计不全。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 传入根路径后,在 filepath.Walk 的回调函数里只处理 os.FileMode.IsRegular() 的文件,跳过目录、设备文件、socket 等
  • strings.HasSuffix(path, ".go") 判断 Go 源文件,别依赖 mime.TypeByExtension —— 它在无网络或无魔数时可能返回空或误判
  • 遇到 filepath.SkipDir 错误(比如 node_modulesvendor)要显式返回,避免钻进大目录拖慢速度

按行读取时跳过空行和注释行有坑

统计“有效代码行”不是简单 len(strings.Split(text, "\n"))。Go 的注释分单行 // 和多行 /* */,且空行、纯空白行、只有注释的行都该剔除。但多行注释跨行时,不能逐行判断 —— 你得维护一个“是否处于多行注释中”的状态。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 对每个 *os.File,用 bufio.Scanner 逐行扫描,避免一次性加载大文件爆内存
  • 用布尔变量 inComment 跟踪 /* 开始后、*/ 之前的状态;遇到 // 直接跳过整行
  • 跳过仅含空白符(strings.TrimSpace(line) == "")的行,但注意 BOM 或 UTF-8 控制字符 —— 实际只需 strings.TrimSpace 已足够覆盖常见情况

filepath.Match 不适合过滤文件名模式

想排除测试文件(*_test.go)或生成代码(mock_*.go)?别用 filepath.Match 做运行时过滤 —— 它只支持 *?,不支持正则,且无法组合多个条件。更糟的是,它匹配的是完整路径,不是文件名,容易误伤(比如 /a/b/mock_foo.go 匹配 "mock_*.go" 失败)。

启科网络PHP商城系统
启科网络PHP商城系统

启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。

下载

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • filepath.Base(path) 提取文件名后再判断,例如:base := filepath.Base(path); strings.HasSuffix(base, "_test.go")
  • 把要排除的模式写成切片,用 for 循环检查,比嵌套 if 更易读、易扩展
  • 如果未来要支持正则,直接换用 regexp.MatchString,但注意编译一次复用,别在循环里反复 regexp.Compile

统计结果差异常源于“空行定义”和“是否含 main 函数”

不同工具对“代码行”的定义不同:有些算所有非空非注释行(LOC),有些只算含语句的行(SLOC),还有些把 func main() { 这种声明行也计入。Golang 自己的 go list -f '{{.GoFiles}}' 不提供行数,所以你的统计器输出和 cloc 或 IDE 插件对不上是正常的。

实操建议:

立即学习go语言免费学习笔记(深入)”;

  • 明确文档里写清你统计的是什么:比如 “非空、非纯注释、非函数/结构体声明首行的行数” —— 用户需要知道这个数字能干什么
  • 如果想接近 cloc 行为,可额外跳过只含 {}functypevar 等关键字开头的单行(但别过度设计,多数场景不需要)
  • 注意 Windows 换行符 \r\n:用 scanner.Scan() 自动处理,别用 bytes.Count\n —— 否则在跨平台项目里会少算

真正难的不是遍历或计数,而是定义清楚“哪一行算一行”。同一份代码,有人要物理行数,有人要逻辑语句数,有人要排除生成文件后的净行数 —— 这些需求没法靠一个开关解决,得从输入参数就区分清楚。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

247

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

356

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

214

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

409

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

490

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

200

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

1438

2025.06.17

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 6.1万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号