-
WaitGroup必须先wg.Add(n)再启动goroutine,且Done()须在goroutine内且仅调用一次;必须传指针避免复制;常与channel配合实现结果收集;复杂场景推荐errgroup.Group。
-
最安全的日志文件打开方式是os.O_CREATE|os.O_WRONLY|os.O_APPEND,缺一不可;必须用bufio.Writer缓冲写入并显式Flush;多goroutine写需加锁;创建前须确保目录存在且权限正确。
-
答案:Golang爬虫需发送请求、解析HTML、设置请求头防封、保存数据。使用net/http发起GET请求,goquery解析页面内容,自定义User-Agent和延时控制频率,数据可存为JSON或数据库,适合高并发扩展。
-
Go函数多返回值需先检查err再用结果,否则可能因零值引发panic;推荐单行if检查、扁平化错误处理及用%w包装错误增强上下文。
-
生产环境推荐SHA256而非MD5进行文件完整性校验;须按块读取避免内存溢出,显式检查io.Copy错误,哈希比对直接用==即可,摘要文件应分离存储并确保来源可信。
-
多module适用于服务分层明确、可复用组件、独立部署单元等场景,通过合理划分项目结构(如domain、pkg、cmd分离),利用replace指令管理本地依赖,并借助接口抽象与依赖注入避免循环依赖,提升大型Go项目的维护效率与模块解耦能力。
-
Go开发需配置关键环境变量以提升效率。1.GOROOT指定Go安装路径,GOPATH设置工作区,GO111MODULE=on启用模块管理,GOPROXY加速依赖下载,GOOS/GOARCH用于交叉编译。2.VSCode中通过settings.json配置goroot、gopath及编辑行为,并在launch.json的env字段设置调试时的环境变量。3.GoLand通过“RunConfigurations”图形界面添加环境变量,支持继承系统变量与多配置切换。4.代码中使用os.Getenv读取变量并设默认
-
Go的net/http能写生产级RESTAPI,但裸用http.HandleFunc无法处理路径参数、JSON解析、统一错误响应和中间件复用;应优先选用gorilla/mux等轻量路由库,并封装JSON和错误响应函数以保证一致性。
-
runtime.NumGoroutine()返回当前程序中正在运行或处于等待状态的goroutine总数,包括用户创建和runtime内部协程,是瞬时、无锁、低开销的整数快照。
-
为什么直接用sync.Map不适合做业务缓存因为sync.Map是为高并发读多写少场景优化的底层结构,缺乏过期、淘汰、统计等缓存必需能力。它不支持TTL(Time-To-Live),不能自动驱逐旧数据,也没有命中率监控接口——这些在真实服务中几乎必须。用sync.Map手动实现过期逻辑,会引入定时器或懒检查,极易导致内存泄漏或时序错误没有容量限制,缓存无限增长,可能触发GC压力或OOM无法区分“未命中”和“值为nil”,业务层需额外包装,增加出错概率推荐方案:用gi
-
应返回零值结构体+nil错误而非nil+sql.ErrNoRows,以区分“查无结果”与“数据库异常”;避免包装sql.ErrNoRows,字段优先用值类型确保零值安全,混用ORM时需统一空对象适配。
-
reflect2更快是因为缓存类型信息、避免重复检查与分配,将反射编译为近原生调用;适用于高频序列化、ORM等场景,但需注意API不兼容、Go版本兼容性风险及低频场景无需替换。
-
RedisStreams是Go中最实用的轻量级分布式队列方案:支持消费者组、ACK、水平扩展;需注意XADD限长、XGROUP预创建、XCLAIM处理pending消息。
-
Pebble数据库需用pebble.Open()初始化并检查err,Close()必须调用以防止数据丢失;路径须可写,Options至少设BytesPerSync和FS;Get/Put要求[]byte且key不可为nil;批量写需防超长key;Pebble适用于高吞吐OLTP场景,无SQL、事务隔离或二级索引。
-
在Go语言中,使用==操作符比较指针和值时有明确区别。1.指针比较检查是否指向同一内存地址,2.值比较检查内容是否相同。基本类型如int、string等直接比较值;指针比较地址,即使内容相同但地址不同则不相等;结构体和数组可比较当所有字段或元素均可比较;切片、映射、函数仅能与nil比较,非nil时需手动遍历或使用自定义方法实现内容比较。接口比较需动态类型和值均相同。实际开发中,身份识别、缓存命中等场景使用指针比较,内容相等性判断则用值比较,不可比较类型需自定义Equal方法处理。理解这些差异有助于编写高效