-
Go语言依赖约定俗成的文件结构而非语法强制:module根目录须有与导入路径一致的go.mod;main函数在packagemain中,推荐置于cmd/下;internal/控制包可见性,pkg/表示公共API;测试文件须同目录且以_test.go结尾。
-
Go的http.Client默认自动重定向存在SSRF、循环跳转等风险,应通过显式配置CheckRedirect函数控制跳转逻辑,返回http.ErrUseLastResponse可安全终止重定向并保留响应体。
-
使用github.com/pkg/errors结合%+v格式可实现带堆栈的错误日志,通过Wrap包装错误以捕获调用堆栈,便于定位问题。
-
优先选原生gRPC而非go-micro:gRPC性能高、跨语言强、控制透明,go-microv4虽基于gRPC但抽象过重易调试困难;新项目应从.proto定义、手写Server/Client起步,结合Consul等真实注册中心与自定义resolver实现服务发现。
-
在Go中,可通过将底层切片类型(如[]*MyType)定义为命名类型(如typeMyTypes[]*MyType),为其添加方法;关键在于方法接收者和构造函数应使用值类型而非指针,以保持与原生切片语义一致,从而直接使用append并兼容JSON序列化。
-
Go接口是隐式实现的,无需显式声明;只要类型方法集完全匹配接口签名(含导出名、参数、返回值),即自动满足,且指针/值接收者影响满足关系。
-
Go1.18+泛型需用type参数声明并配合约束,any仅支持基础操作,复杂行为须用具体约束如~[]E、constraints.Ordered或自定义接口;错误约束会导致类型不安全或过度限制。
-
Go的net.Conn默认是非阻塞的,由运行时自动调度goroutine,无需手动实现类似JavaNIO的轮询机制;用户应使用同步风格代码,配合超时控制和并发优化。
-
.editorconfig在Go项目中易失效,因其不被Go插件默认读取,且需正确配置indent_style=tab等项以配合gofmt,而非对抗;须确保编辑器启用、路径匹配、无覆盖设置。
-
优化Golang微服务网络通信需优先采用HTTP/2+gzip/zstd压缩响应体,并复用HTTP连接池;gRPC+Protobuf适用于高吞吐场景;须避免重复压缩、TLS层压缩及局部创建http.Client。
-
RESTfulAPI应使用复数名词路径(如/users)、避免动词和查询参数承载资源语义,用HTTP方法表达操作,版本置于URL路径(如/v1/users),并选用支持路径参数校验的路由器。
-
使用Cookie与服务端存储实现会话管理,通过生成唯一SessionID并存入Cookie,服务端用map或Redis保存数据;结合中间件校验登录状态,提升安全性需设置HttpOnly、Secure及定期清理过期会话,可借助Gorilla/sessions等库简化开发。
-
GoHTTP客户端实现轮询负载均衡需用atomic维护全局索引,避免每次新建实例重置;节点下线应标记不可用而非删除切片;math/rand.Perm不适用于每请求随机,应改用rand.Intn;负载均衡逻辑必须在请求前确定URL,由Client复用Transport;轮询需配合健康检查与权重支持才实用。
-
Go项目依赖版本控制核心是go.mod+go.sum文件,Git仅托管不参与解析;私有仓库需配置GOPRIVATE和URL重写,模块版本由go.mod内容、时间戳及哈希算法共同决定。
-
gomodwhy用于追踪包的依赖路径,执行gomodwhy包名可查看主模块为何引入该包,输出从主模块到目标包的调用链,帮助识别间接依赖、排查安全漏洞和冗余导入,结合golist-mall和gomodgraph可深度分析依赖关系,是维护复杂项目时定位依赖来源的有效工具。