-
Go标准库net/http足以构建轻量可靠的RESTfulAPI;应使用http.ServeMux路由、统一路径风格、正确设置Content-Type与状态码、封装JSON响应、复用标准错误处理、全程传递context控制超时。
-
直接用chaninterface{}做Pub/Sub会卡死,因Gochannel默认同步,无接收者时发送阻塞;缓冲channel溢出仍阻塞,且无法动态管理订阅者;正确做法是用select+default非阻塞发送或goroutine封装。
-
reflect包可动态调用方法,需通过reflect.ValueOf获取值对象;2.使用MethodByName查找导出方法并验证有效性;3.参数须用reflect.ValueOf封装且类型匹配;4.调用Call传入参数切片并处理多返回值;5.最后一个返回值常为error,需判断是否nil;6.非导出方法无法调用,受访问控制限制;7.反射强大但影响性能,应谨慎使用。
-
Go的time.Sleep基于绝对时间调度,当系统时间被人为大幅回拨(如倒退一天),Sleep可能长时间阻塞——这不是bug,而是设计使然,源于对调度精度与时钟单调性的权衡。
-
Gostruct不支持声明时设默认值,需用NewXXX构造函数显式初始化字段;指针字段可延迟设默认值;第三方反射库有性能和维护风险。
-
Command接口必须显式定义Execute、Undo、Redo三个方法,确保语义正确;历史栈应存命令快照而非指针,避免状态污染和内存泄漏;Undo/Redo需配合canUndo/canRedo校验与currentIndex跟踪以保证原子性;副作用须剥离至Command外层。
-
闭包在Go语言中强大且易误用。1)闭包捕捉环境变量,需理解其生命周期以防内存泄漏。2)使用立即执行函数可避免闭包捕获变量引用误区。3)闭包可修改外部变量,需注意多goroutine下的竞态条件。
-
bufio.Scanner默认缓存整行易致内存爆炸,遇超长行或大文件可能触发ErrTooLong或OOM;适合行短可控文本,非GB级日志场景;若必须使用,应先调用scanner.Buffer(make([]byte,64*1024),1<<31)。
-
使用chanstruct{}是因为零内存开销且语义明确:struct{}占0字节,而bool占1字节、int占8字节;数百goroutine下可节省数十KB内存;其零值唯一、地址相同,支持安全比较;编译器专门优化,发送/接收无额外开销;见名知意,表明仅作信号传递。
-
接口调用开销小,但频繁动态分发、类型断言或不当抽象可能成瓶颈;应优先避免不必要抽象、复用具体类型,类型断言在已知底层类型时可绕过接口查找提升性能。
-
滥用panic本质是错误处理权错配;该用error而非panic的核心判断是调用方能否/应否响应失败:能则返回error,不能且继续执行会致状态污染才考虑panic。
-
Go算术运算符中整数除法截断、%要求同类型;浮点数存在精度误差,0.1+0.2≠0.3;逻辑运算符&&和||严格短路;位运算右移带符号整型会算术右移;复合赋值不改变优先级,位运算优先级低于比较运算符。
-
Go可通过函数类型、闭包和接口组合实现装饰器与策略模式协同:用Handler函数类型统一行为抽象,装饰器链式增强(如超时、重试),策略接口动态切换支付方式,选项模式提升可配置性。
-
微服务中直接用net/http路由不够用,因http.ServeMux仅支持前缀匹配,无法实现服务发现、负载均衡、灰度分流;需基于gin/gorilla构建代理层,对接Consul等注册中心,缓存健康实例并监听变更,结合请求头实现标签路由,同时配置transport超时与错误重试机制。
-
goget拉取指定分支或tag必须用@显式标注版本,不加@默认拉main或master最新提交;go.mod中版本无法阻止goget-u升级,锁版本需明确指定@vX.Y.Z、@branch或@commit。