-
Go包名禁用标准库名(如log)、避免宽泛词(如util)、须小写单数无下划线、同一模块内包名唯一;测试包用xxx_test,需显式重命名冲突导入。
-
go-kit/circuitbreaker默认不生效是因为必须手动调用Execute并传入reqFn(返回error才计失败)、fallbackFn,且状态更新依赖此调用;不包裹请求逻辑则始终处于StateClosed。
-
validator.RegisterValidation是注册自定义规则的唯一入口,需传入规则名、校验函数(func(flvalidator.FieldLevel)bool)和是否跨字段;规则名须与structtag完全一致,否则不生效。
-
goroutine中无法用return返回错误,因return仅作用于当前协程;必须通过通道、回调或加锁共享变量显式传递错误,推荐使用带缓冲的chanerror并确保发送(含nil)。
-
统一安装Go至系统目录并配置全局环境变量,确保所有用户可读共享。通过设置GOROOT、PATH和共享GOPATH,结合组权限管理,实现多用户共用稳定Go环境。
-
启用标准库log需设置时间戳、文件行号并输出到控制台和文件,通过SetFlags、SetPrefix和MultiWriter实现,结合debug开关函数D控制日志等级,程序退出前关闭文件确保日志完整写入。
-
本文详解如何在Go中逐字符(rune)读取文件并可靠跳过Unicode空白字符(如空格、制表符、换行符等),涵盖bufio.Reader.ReadRune的正确用法、注释处理逻辑、常见陷阱规避及生产级代码结构。
-
Go变量声明需按场景选择:包级变量、未赋值或需显式类型时用var;函数内简洁赋值用:=。字符串拼接小规模用+,动态多参数用fmt.Sprintf,高频用strings.Builder。切片cap影响append扩容,len决定下标访问边界。
-
gomodverify报checksummismatch是因本地go.sum记录与实际模块内容不一致,常见于手动修改依赖、replace指向本地路径或go.sum损坏;修复应删go.sum后运行gomodtidy。
-
<p>C代码必须嵌入而非调用:需用//紧贴import"C"上方书写,禁空行、禁//注释、禁Go语句;字符串传参须C.CString+C.free;结构体/数组须用C.struct_xxx和指针;头文件路径用#cgoCFLAGS:-I指定。</p>
-
不能直接用MD5或SHA256存密码,因其计算过快易被暴力破解;即使加盐,若盐固定或可预测仍难防彩虹表;应选用bcrypt、scrypt或Argon2等慢哈希方案,且bcrypt成本因子建议设为12。
-
使用errgroup结合context统一管理批量任务错误,支持并发控制与超时取消,通过channel或互斥锁收集全部错误,确保程序健壮性与可观测性。
-
最稳妥的路子是「滑动窗口+Lua脚本」,因INCR+EXPIRE非原子操作,易致key永久存在或丢失、窗口错乱;必须用Lua保证计数与过期设置的原子性,并统一使用客户端传入的准确时间戳。
-
sync.RWMutex会饿死写锁,因其采用读优先策略:只要存在等待的读请求,新写请求就必须持续排队,导致写操作延迟升高甚至数据陈旧。
-
处理大文件时,Golang的高效读取方式主要有两种:一是使用bufio.Scanner逐行读取文本文件,适合日志分析或文本处理,代码简洁;二是使用io.Reader按块读取二进制文件,适合哈希计算或网络传输,需手动管理缓冲。1.Scanner封装了缓冲逻辑,默认缓冲区为64KB,可设置更大缓冲以处理长行;2.Reader提供更灵活的缓冲控制,适合非文本处理,应复用缓冲区以提升性能;3.根据需求选择:文本按行处理选Scanner,二进制或高性能场景选Reader。两者均基于缓冲机制,适用场景不同,合理选用可