Go命令行加进度条

背景 文件去重功能做好了,但当文件比较多或文件比较大的时候,耗时也会比较久,想加个进度条来直观显示处理进度。 简单尝试了下github.com/schollz/progressbar这个库,完全能满足目前的需求。 使用 安装 1 go get -u github.com/schollz/progressbar/v3 # 注意带版本v3 一般使用 1 2 3 4 5 6 bar := progressbar.Default(n, "描述") defer bar.Close() i := 0; i < n; i++ { bar.Add(1) // 工作代码 } n为总数,当n>0时,显示的是常规的进度条;当n=-1时,显示一个计数的进度。 还有其它比较细的控制及其它场景的使用,等有空了再细细研究下。

2025-03-21 21:38:23 · 1 分钟 · 慢步道人

用Go写一个文件去重工具

背景 想自己做这个功能,主要是因为Duplicate Cleaner这个商业软件只有几天的试用时间,而且文件去重这个逻辑也非常简单。 graph TD a[获取文件清单及大小] --> b[按大小分组] --> c[排除只有一个文件的组] --> d[计算文件Hash值] --> e[按Hash值分组] --> f[排除只有一个文件的组] --> g[选择需要删除的文件] --> h[删除] 问题 计算文件Hash值,使用了hash.Hash接口,自然也用到了goroutine来缩短耗时,但是在测试的时候发现功能不太好用,时好时坏,准确说是有时能获取到重复列表,有时不能。 一点点排查,并且把代码段发给DeepSeek,最终确定是因为hash.Hash不是并发安全的。 修复方法很简单,只要在goroutine内实例化即可。修改之后达到了预期。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 func calcHashs(files []*FileInfo, hashName string) { g := sync.WaitGroup{} for _, file := range files { g.Add(1) go func(f *FileInfo) { defer g.Done() h := newHash(hashName) hashValue, err := calcHash(f....

2025-03-20 16:19:57 · 1 分钟 · 慢步道人

Gin功能列表

gin版本v1.10.0 包函数 方法 含义 说明 BasicAuth 创建一个HTTP基本认证(Basic HTTP Authorization)的中间件 底层调用BasicAuthForRealm BasicAuthForProxy 创建一个HTTP代理基本认证(Basic HTTP Proxy - Authorization)的中间件 BasicAuthForRealm 创建一个HTTP基本认证(Basic HTTP Authorization)的中间件 Bind 创建一个用于将请求中的数据绑定到指定的接口对象上的中间件 CreateTestContext 创建一个干净的Engine实例和一个与之关联的上下文对象用于测试 CreateTestContextOnly 在已有的Engine实例基础上创建一个独立的上下文用于测试 CustomRecovery 根据自定义的处理函数创建一个恢复中间件 底层调用CustomRecoveryWithWriter CustomRecoveryWithWriter 创建一个自定义的恢复中间件 Default 返回一个默认的Engine实例 默认含Logger和Recovery两个中间件 Dir 返回一个http.FileSystem接口的实现,该实现可被http.FileServer使用 DisableBindValidation 关闭默认的验证器 DisableConsoleColor 禁用控制台的颜色输出 EnableJsonDecoderDisallowUnknownFields 开启JSON解码器的DisallowUnknownFields功能 即遇到未知字段时就报错 EnableJsonDecoderUseNumber 开启JSON解码器的UseNumber功能 即将数字解码为json.Number类型,而不是float64,以在需要时精确地转换为整数或浮点数,从而避免精度丢失的问题 ErrorLogger 创建一个能够处理任意类型的错误的中间件 底层调用ErrorLoggerT ErrorLoggerT 创建一个能够处理指定类型的错误的中间件 ForceConsoleColor 强制在控制台输出带有颜色的内容 IsDebugging 判断当前框架是否处于调试模式 Logger 使用默认配置来创建一个日志中间件 底层调用LoggerWithConfig LoggerWithConfig 根据传入的配置来创建一个日志中间件 LoggerWithFormatter 根据指定的格式来创建一个日志中间件 底层调用LoggerWithConfig LoggerWithWriter 根据指定的输出目标创建一个日志中间件 底层调用LoggerWithConfig Mode 返回当前Gin框架的运行模式 有debug、release和test三种模式 New 返回一个全新的、没有任何中间件的Engine实例 Recovery 使用默认配置创建一个恢复中间件 底层调用RecoveryWithWriter RecoveryWithWriter 根据指定输出目标创建一个恢复中间件 底层调用CustomRecoveryWithWriter SetMode 设置gin框架的运行模式 WrapF 将标准的http....

2025-02-23 19:48:17 · 3 分钟 · 慢步道人

Go path包

path包 path包仅适用于处理由正斜杠/分隔的路径,例如URL。 不能处理带有盘符或反斜杠\的Windows路径。 包函数 方法 含义 说明 Base 返回路径的最后一个元素 会先移除路径末尾的斜杠,空路径返回.,纯斜杠返回/ Clean 返回与输入路径等效的最短路径名 Dir 返回路径的目录部分 Ext 返回路径中以.分隔的文件扩展名 无.则返回空字符串 IsAbs 判断路径是否为绝对路径 只有以/开头的才是绝对路径 Join 将路径元素连接成路径 Match 判断路径是否匹配模式 Split 将路径拆分为目录和文件 filepath包 处理方式与目标操作系统定义的文件路径相兼容。 包函数 方法 含义 说明 Abs 返回绝对路径 Base 返回路径的最后一个元素 会先移除路径末尾的斜杠,空路径返回.,纯斜杠返回/ Clean 返回与输入路径等效的最短路径名 Dir 返回路径的目录部分 EvalSymlinks 返回路径中的符号链接所指向的真实路径 Ext 返回路径中以.分隔的文件扩展名 无.则返回空字符串 FromSlash 将路径中/的斜杠替换为特定操作系统的分隔符字符 linux中的\不会被替换 ToSlash 将路径中特定操作系统的分隔符字符替换为/ linux中的\不会被替换 Glob 返回与模式匹配的所有路径 IsAbs 判断路径是否为绝对路径 只有以/开头的才是绝对路径 IsLocal 判断路径是否为本地路径,即是否在当前路径下 仅词法分析,不考虑文件系统 Join 将路径元素连接成路径 Localize 将一个以/分隔的路径转换为一个操作系统路径 Match 判断路径是否匹配模式 Rel 返回从basepath到targpath的相对路径 Split 将路径拆分为目录和文件 SplitList 将一个包含多个以特定操作系统路径分隔符(如:或;)分隔的路径字符串拆分成单个的路径元素 分隔符取决于当前操作系统 VolumeName 返回路径的卷名 适用于Windows平台 Walk 遍历路径下的所有目录和文件并对其调用fn WalkDir 遍历路径下的所有目录和文件并对其调用fn 比Walk更优更高效

2024-11-03 22:12:48 · 1 分钟 · 慢步道人

Go sync包

Mutex 无需显式初始化,直接声明变量即可使用。 互斥锁,同一时刻只能有一个协程持有锁,不分读写。 方法 含义 说明 Lock 加锁 Unlock 解锁 未加锁时调用会导致panic TryLock 尝试加锁 立即返回,成功返回true,失败返回false RWMutex 无需显式初始化,直接声明变量即可使用。 读写锁,同一时刻可以有多个协程持有读锁,但是只能有一个协程持有写锁。 有写锁时,其他协程无法获取读锁和写锁。 有读锁时,其他协程可以获取读锁,但是无法获取写锁。 方法 含义 说明 RLock 加读锁 RUnlock 解读锁 未加读锁时调用会导致panic TryRLock 尝试加读锁 立即返回,成功返回true,失败返回false Lock 加写锁 Unlock 解写锁 未加写锁时调用会导致panic TryLock 尝试加写锁 立即返回,成功返回true,失败返回false Map 无需显式初始化,直接声明变量即可使用。 方法 含义 说明 Store 存储键值对 Load 加载键对应的值 Delete 删除键对应的值 Clear 清除所有键值对 Swap 交换指定键对应的旧值和新值,并返回旧值和操作之前键是否存在 LoadAndDelete 加载键对应的值并删除键值对 LoadOrStore 加载键对应的值,如果键不存在则存储键值对 CompareAndDelete 比较键对应的值是否等于指定值,如果相等则删除键值对 CompareAndSwap 比较键对应的值是否等于指定值,如果相等则替换键对应的值 Range 遍历键值对 传入函数返回false时停止遍历 WaitGroup 无需显式初始化,直接声明变量即可使用。 方法 含义 说明 Add 添加计数器 启动协程前调用,传入协程数量 Done 减少计数器 协程执行完毕后调用 Wait 等待计数器变为0 主协程调用,等待所有协程执行完毕 Once 无需显式初始化,直接声明变量即可使用。 方法 含义 说明 Do 执行函数 传入函数,只会执行一次 Pool 需显式初始化,为New指定创建对象的函数。...

2024-10-30 22:45:48 · 1 分钟 · 慢步道人

Go flag包

简介 flag用于实现命令行标志的解析。 一般流程 定义命令行标志 解析命令行标志 获取解析标志外的命令行参数 使用解析后的标志和参数 支持的标志格式 -flag:短标志 --flag:长标志 -flag=value:短标志和值 -flag value:短标志和值,仅限非布尔标志 解析规则 标志解析会在遇到第一个非标志参数(-被视为非标志参数)或者终止符--之后停止。 1 0 t f T F true false TRUE FALSE True False均可被解析为布尔值。 标志解析的返回值均为对应类型的指针。 包函数 方法 含义 说明 NewFlagSet 创建一个新的标志集 通常用于创建子命令的标志集 Lookup 查找标志集中的标志 Set 设置标志集中的标志的值 NArg 返回实际传入的命令行参数的数量 调用Parse之后生效,不包含命令行标志 Arg 返回第i个命令行参数 从0开始 NFlag 返回实际传入的命令行标志的数量 调用Parse之后生效 Parsed 返回标志是否已被解析 Parse 解析命令行标志 Bool 定义一个布尔型标志 BoolVar 定义一个布尔型标志并绑定到指定变量 Int 定义一个整数标志 IntVar 定义一个整数标志并绑定到指定变量 Int64 定义一个64位整数标志 Int64Var 定义一个64位整数标志并绑定到指定变量 Uint 定义一个无符号整数标志 UintVar 定义一个无符号整数标志并绑定到指定变量 Uint64 定义一个64位无符号整数标志 Uint64Var 定义一个64位无符号整数标志并绑定到指定变量 Float64 定义一个64位浮点数标志 Float64Var 定义一个64位浮点数标志并绑定到指定变量 Duration 定义一个时间间隔标志 DurationVar 定义一个时间间隔标志并绑定到指定变量 String 定义一个字符串标志 StringVar 定义一个字符串标志并绑定到指定变量 Var 定义一个自定义类型标志并绑定到对应变量 自定义类型需要实现flag....

2024-10-27 11:03:21 · 1 分钟 · 慢步道人

Go log包

Logger 方法 含义 说明 Fatal Fatalf Fatalln 记录一条严重错误后执行os.Exit(1) Panic Panicf Panicln 记录一条严重错误后引发panic Print Printf Println 记录一条普通信息 Flags 返回当前Logger的输出标志 SetFlags 设置当前Logger的输出标志 Prefix 返回当前Logger的前缀 SetPrefix 设置当前Logger的前缀 Writer 返回当前Logger的输出目标 SetOutput 设置当前Logger的输出目标 Output 直接输出日志 更接近底层,可指定调用等级 包函数 方法 含义 说明 Default 返回默认的Logger New 创建一个新的Logger Fatal Fatalf Fatalln 记录一条严重错误后执行os.Exit(1) 使用默认的Logger Panic Panicf Panicln 记录一条严重错误后引发panic 使用默认的Logger Print Printf Println 记录一条普通信息 使用默认的Logger Flags 返回默认Logger的输出标志 SetFlags 设置默认Logger的输出标志 Prefix 返回默认Logger的前缀 SetPrefix 设置默认Logger的前缀 Writer 返回默认Logger的输出目标 SetOutput 设置默认Logger的输出目标 Output 使用默认的Logger直接输出日志

2024-10-26 19:43:48 · 1 分钟 · 慢步道人

Go bufio包

Reader 方法 含义 说明 Buffered 返回从当前缓冲区内可以读取的字节数量 Discard 跳过接下来的n字节 Peek 查看接下来的n字节 不移动读指针 Read 从bufio.Reader中读取内容到字节切片 ReadByte 从bufio.Reader中读取一个字节 ReadBytes 从bufio.Reader中读取数据,直到遇到指定的分隔符delim 包含分隔符 ReadLine 从bufio.Reader中读取一行数据 不包含换行符,建议使用Reader.ReadBytes('\n')、Reader.ReadString('\n')或者Scanner ReadRune 从bufio.Reader中读取一个rune ReadSlice 从bufio.Reader中读取数据,直到遇到指定的分隔符delim 包含分隔符,建议使用Reader.ReadBytes或ReadString ReadString 从bufio.Reader中读取数据,直到遇到指定的分隔符delim 包含分隔符 Reset 重置bufio.Reader Size 返回底层缓冲区的大小 UnreadByte 回退最后读取的一个字节 UnreadRune 回退最后读取的一个rune WriteTo 将数据从bufio.Reader写入到io.Writer Writer 方法 含义 说明 Available 返回当前缓冲区中可以写入的字节数量 AvailableBuffer 返回一个空的缓冲区,容量是Available返回的值 Buffered 返回当前缓冲区中已经写入的字节数量 Flush 将缓冲区中的数据写入到io.Writer ReadFrom 从io.Reader读取数据到bufio.Writer Reset 重置bufio.Writer Size 返回底层缓冲区的大小 Write 将数据写入bufio.Writer WriteByte 将一个字节写入bufio.Writer WriteRune 将一个rune写入bufio.Writer WriteString 将一个字符串写入bufio.Writer Scanner 方法 含义 说明 Buffer 设置在扫描时要使用的初始缓冲区,及在扫描过程中可能分配的最大缓冲区大小 Bytes 返回由最近一次调用Scanner....

2024-10-25 21:23:15 · 1 分钟 · 慢步道人

Go io/fs包

包函数 方法 含义 说明 FileInfoToDirEntry 将fs.FileInfo转换为fs.DirEntry FormatDirEntry 将fs.DirEntry格式化为字符串 FormatFileInfo 将fs.FileInfo格式化为字符串 Glob 获取指定模式的文件列表 ReadDir 读取指定目录中的内容,返回DirEntry切片 ReadFile 读取指定文件的内容,返回字节切片 Stat 获取文件信息,返回FileInfo Sub 获取指定目录的子目录 ValidPath 验证路径是否合法 WalkDir 遍历目录

2024-10-24 22:02:04 · 1 分钟 · 慢步道人

Go io包

OffsetWriter OffsetWriter是io.Writer的一个实现,它可以将写入的数据偏移指定的字节数后写入到另一个io.Writer中。 方法 含义 说明 Write 将数据写入io.Writer WriteAt 将数据写入io.Writer,从指定位置开始 Seek 设置指针位置 SectionReader SectionReader是io.Reader的一个实现,它可以从另一个io.Reader中读取指定范围的数据。 方法 含义 说明 Outer 获取底层的ReaderAt、偏移量和长度 Read 从io.Reader读取内容到字节切片 读取后指针位置会移动 ReadAt 从io.Reader读取内容到字节切片,从指定位置开始 读取后指针位置不会移动 Seek 设置指针位置 Size 返回区间的大小 PipeReader PipeReader是io.Reader的一个实现,它可以从另一个io.Reader中读取数据。 方法 含义 说明 Read 从管道读取内容到字节切片 Close 关闭PipeReader CloseWithError 关闭PipeReader并返回错误 PipeWriter PipeWriter是io.Writer的一个实现,它可以将数据写入到另一个io.Reader中。 方法 含义 说明 Write 将数据写入io.Writer Close 关闭PipeWriter CloseWithError 关闭PipeWriter并返回错误 包函数 方法 含义 说明 Copy 将数据从io.Reader复制到io.Writer CopyBuffer 将数据从io.Reader复制到io.Writer,使用指定的缓冲区 CopyN 将数据从io.Reader复制到io.Writer,最多复制n个字节 LimitReader 从io.Reader创建一个限制的读取范围的io.Reader MultiReader 将多个io.Reader组合成一个io.Reader 先后读取,类似内容拼接 MultiWriter 将多个io.Writer组合成一个io.Writer 同时写入 NewOffsetWriter 从io.Writer创建一个带有偏移量的io.Writer NewSectionReader 从io....

2024-10-24 20:05:22 · 1 分钟 · 慢步道人