-
使用fmt.Errorf配合%w可包装错误并保留原始信息,通过errors.Unwrap、Is和As能提取或判断错误链中的具体错误,支持多层上下文添加与精准处理。
-
GORM软删除本质是更新DeletedAt字段而非物理删除,需用*time.Time类型并嵌入gorm.Model;Delete()默认软删,Unscoped().Delete()才硬删;查询默认过滤软删数据,关联预加载不自动过滤。
-
Go中exec.Command不支持shell管道语法,需显式调用sh:exec.Command("/bin/sh","-c","ls|grepmain");StdoutPipe()须在Start()前调用,且cmd1与cmd2均需Wait()并正确关闭管道。
-
因为Scan要求参数为字段地址且顺序类型严格匹配,而结构体字段命名、大小写、跳过标记等与SQL列名不一致;需用反射结合dbtag实现列名到导出字段的自动映射,并注意NULL处理、缓存优化及类型兼容。
-
Go 服务突然报 too many open files 时,先用 /proc/fd 和 lsof 判断文件描述符消耗,再检查 HTTP 响应体关闭、连接复用和 ulimit 配置,最后用指标与回滚手段确认修复有效。
-
net.DialTimeout是Go检测端口开放最直接可靠方式,一行代码conn,err:=net.DialTimeout("tcp","127.0.0.1:22",2*time.Second)即可:err为nil表示端口开放;超时多为过滤,connectionrefused为关闭,noroutetohost为主机不可达;并发需控速,内网50–100、公网10–30,用带缓冲channel限流。
-
Go单元测试应优先使用标准testing包,测试函数须以Test开头、接收*testing.T参数并置于同包的_test.go文件中;推荐用t.Run组织子测试、t.Parallel加速并发、避免t.Fatal滥用,并通过接口抽象解耦依赖。
-
vendor目录本身不提供安全审计能力,它仅存放依赖副本,真正起作用的是go.sum验证机制和外部审计工具对模块版本的扫描;手动复制依赖或篡改vendor会导致校验失效、构建失败或静默拉取网络依赖。
-
viper.WatchConfig()在分布式环境失效,因其依赖本地文件系统监听,无法感知etcd/Nacos/Apollo等远端配置中心变更;需用对应SDK(如etcdWatch、NacosSubscribe、Apollo轮询+ETag)在独立goroutine中监听,并用sync.RWMutex安全更新配置。
-
Activator.CreateInstance在对象池中不推荐直接使用,因其每次调用均绕过JIT缓存、触发类型检查与构造函数反射解析,性能开销大;应优先用Expression.Lambda编译缓存Func<T>委托,或至少缓存ConstructorInfo。
-
gotest-race是最可靠、最贴近真实环境的协程安全测试方式,由Go运行时在内存访问层面实时监控读写冲突,插桩记录所有内存访问并自动识别未同步的并发读写。
-
CompareAndSwapPointer是Go无锁栈唯一可靠起点,因其提供指针级CAS原子操作,支撑安全的“检查-修改”循环;其他原子操作无法保证该语义,易致链表断裂或nilpanic。
-
Go中传数组是值拷贝,需用[N]T避免开销;[N]T明确操作固定内存,适用于CGO、高性能计算等场景;与[]T不可直接转换,unsafe.Pointer强转需谨慎。
-
Go 服务调用外部 HTTP 接口时,如果没有设置超时,慢接口可能让请求一直等待。本文从复现现象开始,逐步定位原因,并给出 Client.Timeout 与 context 截止时间两种可靠写法。
-
debug.PrintStack()可快速打印当前goroutine堆栈,不终止程序但无格式;errors.WithStack()保留原始错误堆栈,适合链式错误;runtime.Caller()手动提取调用信息;pprof可查看所有goroutine全局堆栈。