Cannot convert ‘nil’ to type ‘any’
Invalid type assertion: err.(error) (non-interface type any on the left
解决方法1:在goland设置中将go版本1.18更改为1.17的版本。
解决方案2: 升级goland版本 升级为支持go1.18的版本。
【mac】
之前的go环境是homebrew 下载的go1.18.1的环境 ,然后最近新项目团队决定用go1.17 ,于是直接在goland上goroot那里选了个go1.17.13的sdk,本来一直挺顺畅,代码也没报错。今天给代码加了Makefile后执行make命令的时候就爆了这个错误。
compile: version "go1.17.13" does not match go tool version "go1.18.1"
检查 go env发现goroot的版本是go1.18.1的,然而我goland上开发用的是go1.17.13。所以导致这个错误。然后将goland里的go版本换为了go1.18.1的,虽然代码还能跑,但是点开单个点go文件就会报错。比如本文最后这段代码里nil和err那里就飘红Cannot convert 'nil' to type 'any' Invalid type assertion: err.(error) (non-interface type any on the left)
。
所以现在的状况就是:
因为懒得升级goland。(macwk.com要下载破解版)所以就打算把本地go1.18降为go1.17。于是
brew uninstall go
走的很安详。结束后 使用go env 查看没有go命令了 确认卸载。
然后
brew install go@1.17
竟然比乌龟爬还慢。几分钟才1%,而且报了个错。(记不清楚什么错了,忘记记录了)
于是打算去官网下载。官网:https://go.dev/dl/
使用
uname -a
查看自己系统版本号。找到对应的发布版本号,下载。速度 很快啊(闪电五连鞭…)
然后点点点直接安装。安好了使用go env发现还是找不到go命令。
zsh: command not found: go
去/usr/local/go查看确实是已经安装。
于是
sudo ln -fs /usr/local/go/bin/go /usr/local/bin/go
之后再次查看go env就正常使用了。
回到goland ,选新的goroot ,两个可选项都是go1.17.13。我选了刚装的(/usr/local/go)。选goland下载的也没问题。(/Users/xxx/go/go1.17.13)
代码正常运行。无飘红。OK
func GinRecovery(stack bool) gin.HandlerFunc {
return func(c *gin.Context) {
defer func() {
if err := recover(); err != nil {
// Check for a broken connection, as it is not really a
// condition that warrants a panic stack trace.
var brokenPipe bool
if ne, ok := err.(*net.OpError); ok {
if se, ok := ne.Err.(*os.SyscallError); ok {
if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") {
brokenPipe = true
}
}
}
httpRequest, _ := httputil.DumpRequest(c.Request, false)
if brokenPipe {
Lg.Error(c.Request.URL.Path,
zap.Any("error", err),
zap.String("request", string(httpRequest)),
)
// If the connection is dead, we can't write a status to it.
c.Error(err.(error)) // nolint: errcheck
c.Abort()
return
}
if stack {
Lg.Error("[Recovery from panic]",
zap.Any("error", err),
zap.String("request", string(httpRequest)),
zap.String("stack", string(debug.Stack())),
)
} else {
Lg.Error("[Recovery from panic]",
zap.Any("error", err),
zap.String("request", string(httpRequest)),
)
}
c.AbortWithStatus(http.StatusInternalServerError)
}
}()
c.Next()
}
}