-
httptest包提供两种核心测试方式:NewServer用于集成测试完整HTTP流程(启动真实本地服务器),NewRequest+NewRecorder用于单元测试单个handler(内存中无网络调用)。
-
context用于控制goroutine生命周期和传递取消信号;必须传入context.Context的场景包括调用显式接受该参数的函数(如QueryContext)、HTTPhandler中发起下游请求、启动需受控的子goroutine等。
-
用channel做任务流转更可控,因其具备缓冲、阻塞语义和显式数据契约,可限流、等待完成、统一错误处理,并支持日志、重试、超时等扩展逻辑。
-
什么时候该用RWMutex而不是Mutex读多写少的场景下,RWMutex才有实际收益;如果写操作频繁(比如每秒几十次以上),它反而比Mutex更慢,因为内部多了读计数和唤醒逻辑。典型适用场景:配置缓存、路由表、内存索引、状态快照等——数据被大量goroutine并发读取,但只由少数goroutine更新。读操作远多于写操作(例如读:写>10:1)才值得引入RWMutex写操作本身不能太重(Lock()期间其他写会被阻塞,且所有新读请求也会排队)注意:RWMutex
-
Go的error类型与系统负载无关,需手动采集NumGoroutine和MemStats等指标并注入自定义LoadError,HTTPhandler中应主动返回503状态码及Retry-After头。
-
Go编译默认不嵌入DWARF调试信息,需加-gcflags="all=-N-l"并避免-ldflags="-s-w";core文件需ulimit-cunlimited且未被core_pattern重定向;gdb无法直接识别goroutine,需结合infothreads与bt逐线程分析。
-
在Go语言中,结构体默认作为值类型分配在栈上,但使用new或&创建指针时可能分配在堆上。1.值类型结构体通常分配在栈上,生命周期短、自动释放,适合小对象;2.使用指针可避免复制开销,是否分配在堆取决于逃逸分析结果;3.栈内存分配快且无需GC,堆内存需GC管理,影响性能;4.循环中创建指针可能导致大量堆分配,增加GC压力;5.通过-gobuild-gcflags="-m"可查看逃逸分析结果。选择方式应基于结构体大小、共享需求及性能考量。
-
Go项目接入GitHubActions需分构建、测试、打包、推送四阶段:用setup-go固定1.22版本,docker/build-push-action显式指定linux/amd64平台,镜像打sha+latest双标签,Makefile统一本地与CI命令,密钥通过Vault安全注入,/healthz端点做真实依赖检查。
-
Go语言位运算符直接操作二进制位,适用于性能敏感场景。1.基本运算符包括&(与)、|(或)、^(异或)、&^(清零)、<<(左移)、>>(右移)。2.常用技巧:n&1判断奇偶,n<<k实现n*2^k,异或交换两数,n&(n-1)清除最低位1,n&(-n)提取最低位1。3.可用于设置(n|=(1<<i))、清除(n&^=(1<<i))、判断(n&(1<<i)!=0)特定位。4.结合iota定义状态标志,如权限控制(Read|Write)
-
Go项目接入OpenTelemetry需避开四大陷阱:tracer名称须按服务/模块隔离;HTTP埋点必须用otelhttp或otelgin且顺序正确;OTLPexporter需匹配endpoint协议与鉴权头;resource属性(如service.name)必须显式配置,否则数据全标为unknown_service:go。
-
Go的zip.Writer默认不压缩、不设时间戳、不处理路径和编码,需显式设置header.Method=zip.Deflate、header.Modified、filepath.Clean、UTF-8标志(Flags|=0x800)等,否则导致体积大、乱码、ZipSlip漏洞等问题。
-
UDP无连接,Go中DialUDP仅绑定默认远端地址便于Write,而WriteToUDP才符合UDP本质;固定目标用DialUDP,动态目标必须用ListenUDP+WriteToUDP;接收须用ReadFromUDP,且所有可靠性机制需自行实现。
-
用docker-compose搭Go微服务实验环境最稳,通过独立Dockerfile(alpine基础镜像)、服务名互调(Docker内置DNS)、环境变量传地址、0.0.0.0监听、重试逻辑及合理日志调试,避免端口冲突与“本地能跑”问题。
-
Go1.11起官方推荐使用GoModules替代dep等工具,通过gomod命令直接管理依赖;需Go≥1.11(建议≥1.16),初始化用gomodinit,自动下载依赖并生成go.mod/go.sum,常用命令包括goget、gomodtidy、golist等。
-
unsafe.Pointer(uintptr(x))不是整数转指针的正确方式,因其将uintptr(GC不追踪的整数)误作指针使用,易致悬垂指针、崩溃或脏数据;唯一安全用法是即时中转:unsafe.Pointer→uintptr→unsafe.Pointer,且中间不可存变量、不可跨函数或goroutine。