-
订单服务通过消息队列异步处理后续任务,1.创建订单并发布事件;2.消费者监听队列执行库存、积分、通知操作;3.定时任务检查失败任务并重试。关键技术包括RabbitMQ解耦、SpringTask调度、幂等性控制与死信队列保障可靠性。
-
答案是利用goroutine和channel实现并发处理,结合TCP或WebSocket构建群聊系统。通过Client结构管理用户连接,Hub集中处理消息广播与房间状态,使用register/unregister通道注册客户端,读写协程分离IO操作,解析指令实现/join等命令控制房间进出,广播消息时遍历对应房间clients,最后通过defer关闭资源防止泄漏。
-
事务必须用tx对象操作,db.Begin()返回新实例,原db不受影响;嵌套事务实为SAVEPOINT;推荐用db.Transaction自动管理生命周期;关闭默认事务可提效但需自行兜底。
-
Go不支持原生AOP,但可通过HTTP中间件(如func(http.Handler)http.Handler)、高阶函数装饰器、接口嵌入等方式将日志、鉴权等横切逻辑与业务解耦,避免反射或代码生成以保障性能与类型安全。
-
答案:Golang中TCP短连接适用于请求-响应模式,实现简单但有性能开销;长连接适合高频实时通信,需处理心跳、粘包半包、超时等问题。通过net.Conn生命周期管理,结合goroutine并发模型,使用长度前缀法解决拆包组包,配合ReadFull和deadline控制,可构建高效稳定的长连接服务,同时需注意连接中断检测与资源清理。
-
Go中处理软中断的唯一标准路径是os/signal包,它将信号转为channel消息供goroutine消费;必须用带缓冲channel监听,常用SIGINT/SIGTERM,Windows仅SIGINT可靠,需用select阻塞接收而非range,且应分离信号处理与业务逻辑。
-
Gomutexcontention是指goroutine因争夺sync.Mutex或sync.RWMutex而阻塞等待的现象,表现为P99延迟飙升、goroutine数持续增长、pprofmutexprofile显示大量红色阻塞时间且热点集中于Lock调用。
-
小结构体是否“小”取决于其落入的sizeclass档位,由字段顺序、指针逃逸和Go版本共同决定;真实分配大小需查当前Go版本的sizeclasses.go,而非仅看unsafe.Sizeof(T{})。
-
该用time.Ticker而非time.AfterFunc实现周期性限流调度,因其准时且可复用;需全局复用并手动Stop()防泄漏;令牌桶优于漏桶,推荐atomic.Int64无锁实现;限流判断须毫秒级完成,拒绝即返,不阻塞;context.WithTimeout在限流中间件中无意义。
-
cron包无法满足生产级可靠性,因其是单机内存调度器,无状态持久化、无分布式锁、无幂等保障,导致任务丢失、重复执行或中断无补偿。
-
答案:Golang中事务错误处理需确保操作失败时回滚并保留错误上下文。通过defer+recover机制实现智能回滚,利用命名返回参数判断是否提交;使用fmt.Errorf("%w")包装错误以传递上下文;在事务开始后立即设置defer回滚逻辑,集中管理且避免连接泄露;区分业务错误与数据库错误,定义自定义错误类型如ErrInsufficientFunds,并用errors.Is或errors.As进行上层匹配处理;注意并发场景下的事务泄露、死锁等问题,及时响应context取消信号,防止资源耗尽。(共14
-
GoWebSocket服务端默认拒绝非本地Origin是因websocket.Upgrader的CheckOrigin方法默认返回false所致;需显式配置CheckOrigin,开发可临时设为returntrue,生产必须用白名单校验Origin,包括处理"null"情况。
-
runtime.Stack拿不到完整调用栈因默认仅捕获当前goroutine且缓冲区过小易截断;需预分配足够buf(如1MB)并设all=true获取全量,但会STW,生产环境应优先用pprof。
-
结构体指针通过引用传递实现高效数据共享与修改。Golang中结构体默认值传递,复制大对象开销大,使用指针可避免此问题;函数需修改原结构体时必须传指针,因值传递仅操作副本。Go简化指针访问,支持直接用ptr.Name而非(ptr).Name。方法若需修改接收者,应使用指针类型,否则作用于副本。常见场景包括:工厂函数返回Type、嵌套结构体用指针减少内存占用、接口实现中需修改状态时。掌握结构体指针关键在于理解其性能优势与数据共享机制。
-
Go中全局变量是状态管理最危险的捷径,因其导致并发不安全、测试难隔离、多租户混乱且违反依赖显式化;应将状态绑定到具体实例,用组合+接口驱动流转,仅极少数场景(如连接池)可用sync.Map或atomic.Value安全实现。