-
goroutine长期不退出会导致内存持续增长。因其栈、闭包变量、channel缓冲区均不释放,常见于无退出控制的forrangech或未设超时的time.Sleep;应使用context.Context控制生命周期,避免裸启goroutine,channel操作前检查关闭状态,select必含default或case。
-
Go中测试加密解密需验证一致性与安全性:覆盖往返还原、错误输入、安全配置、集成场景及密钥管理规范。
-
Go的http.SetCookie设不上,主要是因响应头未发送或被拦截:必须在写body前调用,且需注意代理、SameSite大小写、Secure与本地开发冲突、Path/Domain匹配及credentials配置。
-
Go中变量声明即初始化,零值是类型确定的默认值:数值类型为0,bool为false,string为空字符串,指针等为nil,struct各字段取零值,数组元素全为零;time.Time零值为0001-01-01UTC,需用IsZero()判断;reflect.ValueOf(nil)会panic,应传带类型的nil或直接比较零值。
-
Go结构体嵌套仅为字段复用与方法提升,非继承;需避免字段名冲突、注意receiver类型匹配、接口实现须显式满足、JSON序列化需谨慎处理nil指针与零值。
-
Gonet/http默认不校验表单,必须手动验证:先ParseForm(),再对r.PostForm逐字段类型转换、空值检查和规则校验,或用validator结构体绑定验证。
-
GoHTTP中间件捕获自定义错误需主动暴露错误:Gin依赖panic+recover或手动Abort,Echo则通过HandlerFunc返回error触发HTTPErrorHandler;统一用AppError类型封装状态码与消息,并在中间件中类型断言处理。
-
os.Getenv读不到环境变量主因是启动方式导致环境未继承:终端直接执行可读export变量,nohup/systemd需显式配置,IDE需勾选继承选项。
-
Termux中goversion报错因pkg安装的Go版本老旧且GOROOT配置错误,应从官网下载对应架构的.tar.gz包解压至$HOME/go并手动配置GOROOT和PATH。
-
bufio.Scanner默认64KB缓冲限制导致超长行报错,需用scanner.Buffer()设最大上限;替代方案有ReadString(无长度限制)和Read(逐块处理,需手动拼接)。
-
表格驱动测试在Go中为何推荐?因其结构清晰、易维护,提升可读性与扩展性。1.集中管理输入输出;2.提高代码可读性和维护效率;3.方便扩展新用例。实现方式是定义结构体切片包含用例,遍历执行并比较结果,失败时通过t.Errorf输出详细错误信息。还可为用例添加name字段便于定位问题。适合参数和结果确定、多相似场景、无需复杂初始化的测试,尤其适用于纯函数类测试。
-
用sync.WaitGroup控制并发上传的生命周期协程启动后不等它跑完就退出,是多文件上传最常遇到的“上传没报错但文件全丢了”的根源。Go不会自动等待goroutine结束,必须显式同步。常见错误现象:main函数结束,程序直接退出,http.Post还没发出去;或只传了前几个文件就停了。在启动上传协程前调用wg.Add(1),每个文件对应一次Add在上传函数末尾(无论成功失败)调用wg.Done(),别漏在error分支里wg.Wait()放在所有gouploadFile
-
必须用context.WithTimeout而非http.Client.Timeout,因后者仅兜底且不响应取消;服务端需分开配置ReadTimeout和WriteTimeout,避免超时误断流式响应。
-
Go的&&和||严格短路求值,!仅作用于bool类型,不支持三元运算符,多条件混用时必须加括号。
-
从Go1.16起,io/ioutil被弃用,其功能移至io和os包。使用ioutil.ReadFile可读取小文件内容到字节切片,适合一次性加载;ioutil.WriteFile支持将数据写入文件并设置权限如0644;ioutil.TempFile用于创建临时文件,需配合defer关闭和删除。尽管已弃用,了解这些用法有助于维护旧代码并迁移到os.ReadFile、os.WriteFile等现代方法。