-
Golang通过goroutine、channel和sync.WaitGroup实现高效并发,结合context.Context管理超时与取消,在文件读写和网络请求中确保性能与数据一致性。
-
panic不会跨goroutine传播,必须在每个可能panic的goroutine内部用defer+recover捕获;recover仅在defer函数中直接调用有效;recover后须清理资源防泄漏;goroutine中禁用log.Fatal/os.Exit。
-
Go默认采用单一版本选择策略,同一模块路径仅保留一个版本;例外是v2+路径分隔(如/v2)视为新模块,以及主模块内多go.mod结构可各自依赖不同版本。
-
Go应用容器内DNS解析超时主因是ndots=5:短域名如redis被拼为redis.default.svc.cluster.local.多次查询失败后才回退,导致连接卡顿或超时。
-
答案:Golang中RPC超时与重试机制通过context控制超时、循环重试结合指数退避策略,区分可重试错误类型,避免无限重试与资源浪费,提升微服务稳定性与容错能力。
-
答案:高并发下锁优化需减少竞争、缩短持有时间、降低粒度。具体包括:将非临界区代码移出同步块,使用细粒度锁(如分段加锁),优先采用原子类(如LongAdder)和无锁结构,读多写少场景用读写锁或乐观锁,结合监控持续调优。
-
Go中测试JSON序列化与反序列化需确保双向转换保值、保类型、保字段语义,重点验证标签控制、零值处理、嵌套结构、自定义方法及边界场景。
-
用sync.WaitGroup控制并发上传的生命周期协程启动后不等它跑完就退出,是多文件上传最常遇到的“上传没报错但文件全丢了”的根源。Go不会自动等待goroutine结束,必须显式同步。常见错误现象:main函数结束,程序直接退出,http.Post还没发出去;或只传了前几个文件就停了。在启动上传协程前调用wg.Add(1),每个文件对应一次Add在上传函数末尾(无论成功失败)调用wg.Done(),别漏在error分支里wg.Wait()放在所有gouploadFile
-
RPC调用慢主因是客户端连接未复用、超时缺失、序列化低效或服务端线程阻塞;应全局复用grpc.ClientConn、强制设Context超时、启用gzip压缩、用sync.Pool缓存对象、避免热路径内存分配。
-
不能直接实现net.Conn接口,因为它隐含TCP语义契约:Read()需阻塞直到数据就绪或出错,Write()须处理部分写,Close()要保证双工关闭顺序;硬实现易致io.EOF混乱、假死、goroutine泄漏。
-
使用结构化日志、集中收集、请求追踪和可视化分析可构建高效Golang日志体系:1.采用zap等库输出JSON格式日志;2.通过Loki或ELK集中存储与查询;3.中间件生成X-Request-ID实现链路追踪;4.Grafana仪表盘监控QPS、延迟并配置错误告警规则。
-
值类型切片存储数据副本,修改不影响原变量;指针类型切片存储地址引用,可修改原始数据并节省内存。1.值类型适用于小对象和数据隔离场景。2.指针类型适合大结构体和需共享状态的场景。3.注意循环中取地址导致的指针复用问题。4.根据数据大小、共享需求选择[]T或[]*T,提升效率并避免bug。
-
sync.Pool适用于频繁创建销毁、结构简单、无外部引用且可安全重置的对象;必须设置New字段返回指针,Get后须调用Reset清空状态,避免数据污染和悬垂引用。
-
tabwriter.Writer需显式Flush()才输出,\n仅作行终止符,中文错位因按字节计宽,应预处理宽度或调大minWidth/tabWidth。
-
掌握Go基本数据类型关键在于理解用途、边界和陷阱:整数按需选小,禁用int/uint跨平台;float64为默认,禁用==比较浮点数;字符串是UTF-8字节序列,Unicode字符须用rune;bool零值为false,nil不适用于基本类型。