-
使用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。
-
GoHTTP测试核心是用httptest.NewRequest和httptest.NewRecorder绕过网络、直接测试handler,结合mock依赖与框架适配,覆盖成功及错误路径。
-
Go中无接口继承,Observer模式通过函数类型和接口组合实现:Observer为func(eventinterface{})类型,Subject接口仅含Register、Unregister、Notify方法;并发安全需用sync.RWMutex细粒度锁,Notify时先拷贝观察者快照再解锁遍历,避免map并发读写与阻塞。
-
不能直接修改default-scheduler源码,因其为独立二进制,修改即维护fork分支,导致升级困难、安全滞后、无法享受调度框架演进;应通过编写外部调度器实现可维护扩展。
-
高并发下本地磁盘IO瓶颈无法靠增加goroutine解决,必须解耦I/O与CPU工作:单goroutine顺序读+合理缓冲(如64KB)+按逻辑边界分块处理,避免多goroutine争抢同一文件导致寻道恶化。
-
Context仅传递取消信号、超时控制及少量元数据(如traceID),业务数据应走函数参数或结构体;WithValue的key须为自定义类型;HTTPhandler优先用WithTimeout并defercancel;goroutine中defercancel会失效,应传入外部ctx或显式调用cancel。
-
使用goinstall而非gobuild才能将可执行文件输出到GOBIN;需正确设置并导出GOBIN路径,确保目录存在且有写权限,并将其加入PATH;在模块模式下应使用完整导入路径或在项目根目录执行goinstall.;仅main包会生成可执行文件。
-
os.Stat最轻量获取文件元信息,但不保证文件存在;需用os.IsNotExist(err)判断;FileInfo.Size()是逻辑长度非磁盘占用;os.ReadDir比filepath.Walk快但不递归;ModTime()精度依赖文件系统。