-
Go函数参数是值传递,只有传指针(T)才能修改外部变量值;需调用时用&取地址、函数声明指针类型、体内用p赋值;注意nil指针解引用panic及指针本身可变性。
-
Go中并发安全map的选择需根据场景权衡:读多写少且键集稳定时优先使用sync.Map,因其内部优化读操作;若需复杂原子操作或写频繁,则用sync.RWMutex保护普通map更灵活;大量删除场景应注意sync.Map内存堆积问题,结合压测选择最优方案。
-
Go基准测试必须用gotest-bench启动,手动运行无效;函数需为funcBenchmarkXxx(*testing.B)格式;b.ResetTimer()应在初始化后、循环前调用,避免准备时间计入耗时。
-
可以,但需满足依赖已缓存、go.mod/go.sum完整未篡改;首次构建后,不执行goget或修改版本即可离线build;通过gomodverify、gomoddownload-json等验证缓存完整性。
-
Go语言端口扫描通过net.DialTimeout并发探测TCP连接,成功即开放,超时或connectionrefused分别表示被过滤或关闭;配合goroutine与channel实现高效批量扫描。
-
Go语言的net/http包自动为每个传入的HTTP请求创建独立的Goroutine,因此对于简单的数据库查询、会话验证等RESTAPI操作,无需手动设置Goroutine。只有当请求需要触发耗时较长的后台任务,且不希望阻塞客户端响应时,才应考虑主动创建Goroutine进行异步处理,以提升API的响应速度和用户体验。
-
使用context.Context管理RPC请求的超时、取消和元数据传递,gRPC原生支持上下文,而net/rpc需封装模拟,推荐gRPC以实现更完整的上下文控制。
-
业务错误必须用自定义BizError结构体封装,携带Code、Message、TraceID等字段,便于识别、分类和统一处理;系统错误需用%w包装保留原始error链,区分可恢复性;HTTPhandler中依错误类型分流返回4xx或500状态码。
-
桥接模式通过接口与组合分离抽象与实现,如遥控器控制不同设备。定义Device接口,TV和Radio实现其方法;RemoteControl持有Device接口,实现基础操作;AdvancedRemote嵌入RemoteControl并扩展静音功能。使用时,tv:=&TV{};remote:=NewRemoteControl(tv);remote.Power()输出"TVisON";radio:=&Radio{};advanced:=NewAdvancedRemote(radio);advanced.Mute
-
CI禁用gomodvendor是因它破坏可重现性:vendor目录易未提交或缓存污染,且不校验go.sum哈希;CI应信任go.mod+go.sum,统一GOPROXY并清理模块缓存。
-
当向goroutine传递过大的结构体时,Go运行时会因超出新协程可用栈空间而触发“functionargumentstoolargefornewgoroutine”错误;根本解决方式是避免值传递大对象,改用指针、拆分参数或复用内存。
-
Go中[]*T切片遍历时通过解引用可直接修改原始数据:因切片元素为指向T实例的指针,u.Age+=1等操作作用于原结构体字段;但u=&User{...}仅改变局部指针副本,不影响原数据。
-
使用sync.WaitGroup配合带缓冲的通道和结构化结果类型,是Go中处理未知深度递归爬虫并安全关闭通道的惯用方案。
-
使用Golang的gzip包结合缓冲控制、sync.Pool复用Writer、并发处理及压缩级别调优可显著提升文件压缩解压性能。通过bufio减少I/O系统调用,64KB缓冲为常用平衡点;sync.Pool降低内存分配开销;goroutine配合worker模式实现多文件并行压缩;根据场景选择BestSpeed、DefaultCompression或BestCompression级别,在吞吐、CPU与压缩率间取得平衡,适用于高并发大数据处理场景。
-
Go禁止值类型与指针类型直接转换,且不支持不同指针类型间强制转换,即使底层类型相同;只能通过unsafe.Pointer实现底层指针转换,但存在安全风险;同时方法接收者类型影响接口实现,*T的方法可被T自动继承,反之则不行。