-
Go的net/http包虽开箱即用,但需注意端口冲突panic、路由注册时机、handler签名正确性、路径匹配缺陷、请求体解析顺序、静态文件路径穿越等关键陷阱。
-
Go中用channel实现pipeline需满足:无缓冲channel+显式关闭+range接收;每个stage函数接收inchanT、返回outchanU,并在所有路径(含panicdefer)关闭out;调用方控制goroutine并发;需监控阻塞时长与缓冲水位,确保吞吐匹配、错误可观察隔离。
-
90%新项目应选gqlgen但禁用自动Resolver生成,仅生成schema到Gostruct映射和空壳resolver;手动按领域组织实现,管控context传递、HTTP客户端分层超时、json.RawMessage映射为JSON标量,并启用MaxDepth防栈溢出。
-
Go的SetKeepAlive默认不生效,需显式调用SetKeepAlive(true)并配合SetKeepAlivePeriod(或syscall手动设置TCP_KEEPIDLE/KEEPINTVL/KEEPCNT);服务端须用ListenConfig.Control在socket创建时配置,客户端连接后立即设置;KeepAlive仅探测链路可达性,须与应用层心跳协同。
-
goroutine中无法用return返回错误,因return仅作用于当前协程;必须通过通道、回调或加锁共享变量显式传递错误,推荐使用带缓冲的chanerror并确保发送(含nil)。
-
答案:Go内存模型通过“happens-before”原则确保并发可见性,依赖通道、互斥锁、WaitGroup等原语建立操作顺序,避免数据竞态;正确使用同步机制可防止脏读、丢失更新等问题。
-
默认GoDocker镜像体积大(800MB+)是因为包含完整开发工具链,而distroless静态镜像仅含内核接口、静态链接二进制和必要运行时,体积仅2–3MB,需禁用CGO并静态编译。
-
Go语言无内置回归测试框架,但用testing包+标准实践即可高效支撑:gotest自动发现Test开头函数,支持递归执行、精准重放、稳定性检查;需用构建约束或t.Skipf控制用例启停;推荐testify/assert与goldenfile管理预期输出;CI中须锁定Go版本并提交go.sum确保环境一致。
-
JSON标签是结构体字段的元信息,由encoding/json包通过反射读取;手动解析需用reflect获取tag值并按“name,option”格式拆分处理,注意导出字段限制和常见选项语义。
-
GoWeb开发中应统一解析查询参数并封装分页响应。定义ListQuery结构体集中管理分页与过滤字段,用ShouldBindQuery自动校验;返回PageResult泛型结构,隐藏数据库细节,含数据、页码、总数、总页数及has_more标识。
-
time.Ticker为什么不适合毫秒级高频任务因为time.Ticker底层依赖系统调度和goroutine唤醒,当间隔设为1ms或更低时,实际触发间隔会严重漂移(实测常达2–15ms),且持续运行会显著抬高GC压力和调度开销。Go运行时默认最小调度精度约10ms(受OStimerresolution和GOMAXPROCS影响)每秒1000次Tick会产生大量待处理的channel发送操作,堆积在runtime的netpoller或timerh
-
Go语言net/url包通过url.URL结构体和url.Parse()等函数提供安全的URL解析与构造能力,自动解码路径和查询参数(不含fragment),推荐检查error;修改Path应用url.PathEscape(),查询参数需通过u.Query()操作后Encode()赋值;拼接相对路径应使用ResolveReference();编码须区分url.PathEscape()和url.QueryEscape()。
-
error用于可预期、可恢复的业务失败,如文件打开失败;panic仅用于程序无法继续的致命错误,如初始化崩溃。二者目的不同,不可混用。
-
Go并行处理CPU密集任务应采用分块+固定worker池模式,配合sync.Pool复用对象、启用编译器向量化及必要时绑定OS线程。
-
不用fmt.Sprintf拼SQL因会导致SQL注入、空条件残留、参数顺序错乱;应使用预处理占位符(如$1、?)和结构化Builder存储条件、参数、排序等片段,由业务层控制条件有效性,Build时校验合法性并避免实例复用。