redigo的Conn接口Do方法被内联,添加//go:noinline不生效如何解决
解决方案
1. 清理Go包缓存后重新编译
这是//go:noinline不生效的最常见原因:Go默认会缓存第三方依赖包的编译产物,你修改redigo源码后,编译器默认会使用之前缓存的旧版本编译结果,不会用你修改后的代码。
执行如下命令清理对应包的缓存后再重新编译你的程序即可:
# 清理redigo redis包的旧编译产物 go clean -i github.com/gomodule/redigo/redis # 清理模块缓存(如果使用Go Module管理依赖) go clean -modcache # 重新编译你的应用 go build -o your-app main.go
2. 编译时指定禁用redigo包的内联
如果修改源码的方式不生效,可以直接在编译时通过gcflags参数强制禁用redigo redis包的所有内联:
go build -gcflags="github.com/gomodule/redigo/redis=-l" -o your-app main.go
其中-l是Go编译器的禁用内联参数,指定包路径后只会对该包生效,不会影响你业务代码的内联优化。
3. 修改函数体破坏内联条件
如果上述方法都不生效,可以在Do方法内加一段永远不会执行的逻辑,增加函数体积让编译器判定其不符合内联要求:
//go:noinline func (c *conn) Do(cmd string, args ...interface{}) (interface{}, error) { // 新增永不触发的逻辑,破坏内联判定条件 if false { _, _ = fmt.Println("") } return c.DoWithTimeout(c.readTimeout, cmd, args...) }
修改后重复第一步清理缓存重新编译即可。
内容的提问来源于stack exchange,提问作者ManojKumar
相关产品推荐
相关产品推荐

