Cannot convert ‘nil‘ to type ‘any‘。goland低版本不支持范型报错

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的goroot版本选go1.17.13,makefile不能执行。
  • goland的goroot版本选go1.18.1,代码飘红。(飘红原因貌似是goland版本低,没有升级为支持go1.18的原因)

因为懒得升级goland。(macwk.com要下载破解版)所以就打算把本地go1.18降为go1.17。于是

brew uninstall go

走的很安详。结束后 使用go env 查看没有go命令了 确认卸载。
然后

brew install [email protected]

竟然比乌龟爬还慢。几分钟才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()
	}
}

你可能感兴趣的:(goland&go环境,golang)