Go教程技术文章
-
slice本身不会泄露,但其Data指针会“钉住”整个底层数组,导致本该被GC回收的大块内存长期驻留;根本原因是SliceHeader中Data指针存在即视为整块底层数组仍在使用,哪怕仅取s[i:j]并存入context或缓存,几MB原始数组也无法释放。430 收藏 -
new(T)在Go中几乎从不必要,推荐用varxT或字面量初始化值类型;new仅适用于泛型、反射等少数需零值指针的场景。463 收藏 -
本文介绍使用Go的map[string]interface{}动态解析JSON,快速提取嵌套字段(如Solr响应中的"response"),避免繁琐的struct定义,兼顾灵活性与开发效率。200 收藏 -
不会。gomodtidy不会重写源码中的import语句,只负责下载缺失模块、删除未引用的依赖、更新go.sum;路径变更需手动或借助IDE/命令行工具完成。412 收藏 -
使用math/rand需设种子避免重复序列,如用time.Now().UnixNano()初始化,可生成整数、浮点数及分布随机数,全局函数并发安全但性能低,高并发宜用独立Rand实例。247 收藏 -
Go微服务本身不该处理跨域预检请求,OPTIONS请求应由API网关或反向代理统一承接;常见原因是Nginx等网关默认不转发OPTIONS而直接返回405或204,且net/http.ServeMux不自动响应OPTIONS,需显式配置或中间件支持。336 收藏 -
真实业务中Gin与Fiber性能差异几乎不可感知,因数据库、序列化、日志等耗时占端到端延迟60%~80%,框架调度开销通常低于5%;压测QPS差约6%仅在纯JSON路径下成立,实际场景中被其他环节完全淹没。212 收藏 -
使用中间件记录HTTP请求日志,通过拦截请求获取客户端IP、方法、路径、状态码等信息,结合zap实现结构化JSON日志输出,并利用channel异步写入与lumberjack轮转日志文件,确保高性能与可维护性。264 收藏 -
go-swagger默认不解析普通注释,仅识别紧贴导出函数上方的//swagger:route和//swagger:operation标签;struct需被显式引用且导出才能生成model;嵌入UI需手动挂载静态资源,推荐swag替代以简化流程。141 收藏 -
rate.NewLimiter(rate.Limit,burst)的两个参数分别是令牌生成速率(每秒补充令牌数,float64)和桶最大容量(int),burst至少应与rate相当(如rate.Limit(10)配burst=10),过小导致首秒大量拒绝,过大则限流失效;rate<0.01时因纳秒精度丢失行为异常。257 收藏 -
小文件用os.ReadFile但需严谨错误处理:检查err、区分错误类型、注意100MB隐式上限及UTF-8编码限制;大文件须用bufio.Scanner并调整缓冲区防超长行报错。152 收藏 -
类型断言在汇编中仅是两次指针比较,Go编译器对x.(T)生成极简代码:读itab和data字段,用CMPQ比itab与T的类型描述符地址,相等则继续,否则跳fallback,无函数调用、无堆分配、不进runtime。134 收藏 -
直接使用aliyun/aliyun-oss-go-sdk/ossSDK,避免手拼HTTP请求;初始化client常见panic或403因endpoint格式错误(须为https://oss-cn-hangzhou.aliyuncs.com)、凭据未走正确链路(须用RAM子账号+环境变量OSS_ACCESS_KEY_ID/SECRET或ECS角色)。328 收藏 -
defer必须写在panic前面,因为defer是立即注册动作,将函数压入defer栈,而panic只执行已入栈的defer;若defer在panic后,则根本不会执行注册,自然不运行。415 收藏 -
生产环境必须用pgxpool.Pool,因其支持连接复用、健康检查、自动重连和context取消;pgx.Connect和sql.Open+lib/pq均不满足高并发与稳定性要求。473 收藏