-
用os/exec.Command执行命令需注意四点:捕获输出用Output()或管道,错误判断要区分exec.Error和*exec.ExitError,shell特性需显式调用/bin/sh或cmd.exe,超时控制必须用context并合理管理进程组。
-
const声明的配置值为什么在运行时不能被修改因为const是编译期常量,Go在编译阶段就把它的值内联进所有引用位置,生成的二进制里根本不存在“变量地址”。这不是权限限制,而是语言设计决定的——没有内存地址,自然无法取地址、无法反射修改、也无法通过指针间接改写。常见错误现象:cannottaketheaddressofxxx或cannotassigntoxxx,尤其当你试图把const传给需要*string的函数时使用场景:适合纯静态配置,比如API版本号
-
中间件是接收并返回http.Handler的函数,用于在请求前后执行日志、认证等通用逻辑。通过嵌套组合或使用chi等库的Use方法,可构建灵活的HTTP服务处理链。
-
Go单元测试应优先使用标准testing包,测试函数须以Test开头、接收*testing.T参数并置于同包的_test.go文件中;推荐用t.Run组织子测试、t.Parallel加速并发、避免t.Fatal滥用,并通过接口抽象解耦依赖。
-
Go中数组指针声明为*[N]T,初始化需取固定长度数组地址,解引用后可原地修改原数组,支持索引和len()但不可用append(),适用于固定大小缓冲区的零拷贝场景。
-
GoldenFile测试本质是比对文本快照,仅确认输出与golden.txt一字不差,不验证逻辑正确性;适合CLI帮助、YAML/JSON模板等确定性输出,不适合含时间戳、随机ID等动态内容。
-
需开启innodb_print_all_deadlocks=ON并确保log_error可写,死锁日志仅存于错误日志;Go中需捕获*mysql.MySQLError且Number==1213识别真死锁,避免非确定顺序加锁,结合时间戳、SQL模式与事务日志交叉定位。
-
桥接模式的核心思想是抽象与实现分离。其关键在于将两个独立变化的维度(如图形和颜色)解耦,通过组合方式代替继承关系,避免类爆炸问题。具体实现步骤包括:1.定义两个独立接口(抽象和实现)2.分别定义各自的实现结构体3.在抽象结构体中嵌入实现接口作为字段4.使用组合方式完成调用。Go语言中通过接口和结构体组合能自然实现该模式,并适用于多维变化、需动态切换实现及避免类爆炸的场景。
-
Go语言无抢占式锁,sync.Mutex等锁不可被强制中断;获取失败需靠context超时、channel协作等方式实现“类抢占”,锁释放必须显式调用Unlock。
-
根本原因是向已关闭的websocket连接写数据;应通过读协程监听EOF/CloseMessage并关闭连接,写操作改用带缓冲channel+专属写协程,广播时非阻塞发送并丢弃满载消息。
-
校验框架通过结构体tag声明规则并用反射动态执行:解析validate标签为键值对,按字段类型调用对应校验器,支持嵌套递归与自定义规则插拔,错误含完整字段路径。
-
直接用golang.org/x/time/rate容易限不住流量,因其默认基于请求到达时间做令牌桶判断,单实例无法感知全局流量,导致多实例下总流量超限;真正可用的限流需跨实例共享状态、支持突发控制、区分调用方或接口粒度。
-
应抽象出Clock接口并显式注入,而非尝试mocktime.Now();Go1.20+可用time.Clock,但需注意其作用域限制,推荐自定义接口统一管理时间依赖。
-
使用%w包裹错误可形成错误链,结合errors.Unwrap、Is、As实现精准匹配与逐层解析,配合github.com/pkg/errors记录堆栈,提升Go程序调试效率。
-
Go反射无法获取函数参数名,因编译后二进制不保留形参标识符;可通过结构体封装、源码解析或生成代码等方式替代,但runtime.Caller等“猜测”方式不可靠。