-
最简GET请求需检查err并defer关闭resp.Body;生产环境应自定义http.Client设超时、复用连接;POST等复杂请求须用http.NewRequest+Do;重定向、Cookie、代理等行为可通过Client和Transport字段精细控制。
-
Go的http.Client默认自动跟随301/302/307/308重定向,但301/302会将非GET请求转为GET并丢弃body,而307/308严格保持原方法和body;可通过CheckRedirect自定义控制跳转逻辑或手动处理以确保行为符合预期。
-
strings.Split易panic因不滤空串且遇空分隔符或越界访问即崩溃;SplitN可控切分次数;Fields自动跳过空白分隔的空项;regexp.Split用于复杂模式但性能较低。
-
官方推荐使用mongo-go-driver(go.mongodb.org/mongo-driver/mongo),连接需context和URI,CRUD操作须注意bson.M与结构体解码、UpdateOne的$set用法、Aggregate游标必须Close。
-
未指定容量会导致map频繁扩容、rehash和内存拷贝,引发CPU占用升高与GC压力增大;预分配可减少早期多次小扩容,提升性能约1.8倍。
-
logrus支持日志分级与多输出配置,通过SetLevel设置级别,SetOutput配置输出目标;zap提供高性能结构化日志,NewProduction创建生产日志器,支持JSON格式输出,结合lumberjack实现日志轮转,适用于高并发场景。
-
Go测试要求Test函数名与文件名严格匹配:函数须为funcTestXxx(t*testing.T),文件须为xxx_test.go,且同包、无返回值、参数唯一;必须用t.Run表驱动,显式复制循环变量,合理使用t.Error/t.Fatal,并注意子测试并发安全。
-
Gomodtidy报错“unknownrevision”或“nomatchingversions”直接原因是Go尝试解析一个没有明确go.mod的子目录路径,但该路径在远程仓库中并不存在独立模块声明。Go不会自动把github.com/user/repo/subdir当成模块——它只认根目录或显式打过tag的子模块路径。常见错误现象:gomodtidy卡住、报unknownrevision;gogetgithub.com/user/repo/subdir失
-
Go中控制HTTP并发数的核心是用chanstruct{}实现信号量:make(chanstruct{},N)创建容量为N的通道作为许可证池,goroutine需先向其写入再发请求,零内存开销且语义清晰。
-
UDP打洞失败头号原因是bind端口不一致:双方随机绑定导致NAT映射失效;应固定端口、预热映射、同步打洞,并依NAT类型决定是否需中继。
-
Prose库在Golang项目中的安装和初始化步骤如下:首先确保已安装Go环境,推荐使用Go1.16及以上版本;接着通过执行gogetgithub.com/jdkato/prose命令引入Prose库及其依赖;随后在代码中导入并调用prose.NewDocument函数创建文档对象进行文本处理。
-
http.FileServer可直接提供静态资源服务,需用filepath.Abs转绝对路径防部署异常;默认不支持目录列表和index.html自动查找,须手动注册根路由;其内置安全过滤可防路径穿越,但需注意权限与MIME类型扩展。
-
清理资源是Go测试的关键环节,忽视可能导致测试失败或影响生产环境。针对文件操作,应使用ioutil.TempDir或os.CreateTemp创建临时目录并测试后用deferos.RemoveAll(tempDir)删除;对于数据库连接,需使用专用测试库并在测试前后清空数据表及关闭连接;测试中启动的HTTP服务或TCP监听器必须在测试结束时通过srv.Shutdown(ctx)优雅关闭;此外,异步任务如goroutine和定时器应带上context并调用timer.Stop()确保释放。以上步骤依次保障了
-
函数通过复合结构实现多值返回:Python用元组解包,JavaScript/C++/Go用对象或结构体,Go原生支持多返回值,数组适用于同类型数据,C/C++通过指针传递输出参数。
-
gRPC是Go微服务间调用最稳妥方案,因其类型安全、高性能和协议一致性;HTTP/JSON仅适用于对外暴露或临时桥接,内部调用应避免。