-
临界区是访问共享资源的代码段,如修改全局变量或操作公共数据结构。多个goroutine同时进入会导致数据竞争,例如并发执行i++可能结果异常。Go通过sync.Mutex的Lock()和Unlock()方法保护临界区:varmusync.Mutex;mu.Lock();defermu.Unlock();counter++。Lock()阻塞其他goroutine直至Unlock()释放锁,defer确保即使panic也能释放,避免死锁。适用于小段关键代码,如更新map或结构体字段,但应避免在锁内执行耗时操作
-
CanAddr()检查值是否可寻址(能否取地址),CanInterface()检查值是否可安全转为interface{}(需有效、可导出且非只读);二者维度不同,不可互替,调用Interface()前必须检查CanInterface(),修改值则需依次验证IsValid()→CanAddr()→CanSet()。
-
Go的switch支持任意可比较类型,但浮点数因精度问题不建议用于case;interface{}需用type断言;fallthrough极少使用,仅适用于连续整数的特殊逻辑共享。
-
原生map非并发安全,读写冲突会触发panic;sync.Map仅适用于读多写少场景,有性能与功能限制;推荐用sync.RWMutex封装原生map,必要时采用分片锁优化写吞吐。
-
最常踩的坑是消息“发了但没到”:SyncProducer仅适合调试,生产环境必须用AsyncProducer并监听Successes/Errors;RequiredAcks需配WaitForAll且ISR≥ReplicationFactor;超时与broker对齐;务必用ByteEncoder;Topic须显式创建并验证ACTIVE;Version必须匹配服务端;元数据变更需主动RefreshMetadata。
-
math.Abs仅接受float64类型,传入int、int64或float32会编译报错;整数取绝对值应使用条件判断或Go1.18+泛型封装,float32需先转float64再调用。
-
Go的http.ResponseWriter必须禁用缓冲并显式Flush才能实时推送SSE,需设置Content-Type、Cache-Control、Connection头,严格按data:xxx\n\n格式写入,用channel广播事件并监听context.Done()及时清理连接。
-
rpc.Register必须依赖反射,因Go编译期无法预知用户结构体及方法,需运行时通过reflect.TypeOf.Elem()获取类型、NumMethod()遍历方法、验证签名并存入全局map。
-
全量同步是Redis主从复制中从节点首次连接或断连超时后的兜底机制,通过PSYNC?-1触发,主节点执行BGSAVE生成RDB快照并缓存增量命令,再传输RDB及缓冲区命令完成数据一致。
-
Go无内置migrate命令,需用第三方库;migrate支持CLI和SDK但行为不同,文件名须严格为14位时间戳+下划线+描述+.sql,CI/CD中须防重复执行与脏状态。
-
Go的http.Client默认自动处理301、302、307、308重定向,最多10次跳转;通过设置CheckRedirect可自定义策略,如限制跳转次数、域名或记录路径;返回http.ErrUseLastResponse可禁用自动跳转并手动处理状态码;实际开发中应校验URL、防止SSRF、显式处理API重定向,并注意请求方法和Cookie的传递行为。
-
Go语言中net/http不支持命名路由,需用gorilla/mux({name}语法+Vars)、Gin(:id语法+Param)或手动解析(Split/正则)提取URL参数,mux和Gin还支持通配符处理可选路径。
-
工作池核心是限流而非简单并发,需用固定worker数+带缓冲channel控制任务队列与结果传递,避免goroutine泛滥、阻塞和panic导致卡死。
-
直接起goroutine处理请求会导致内存暴涨、调度过载甚至OOM,因Go不限流且goroutine有栈开销;应使用带缓冲channel+固定worker池限流,并结合context与errgroup实现超时控制和优雅退出。
-
根本原因是kube-batch不自动处理原生Job,需显式启用job插件并添加注解plugins.kube-batch.scheduling.k8s.io/job:"true";同时须配置PodGroup、Queue及schedulerName="kube-batch"形成闭环。