golang - 如何获得错误“已评估但未使用”

Posted

技术标签:

【中文标题】golang - 如何获得错误“已评估但未使用”【英文标题】:golang - How to get error "evaluated but not used" 【发布时间】:2019-01-09 23:09:54 【问题描述】:

对于代码append(slice1, 1),Go 编译将给出错误“append(...) 已评估但未使用”。而且我们必须使用slice1 = append(slice1,1),因为append不会修改slice1,它会返回一个新的slice。

我认为这是一个很好的提示,因为这将防止很多错误,因为我们通常不知道像 append 这样的函数是否会改变原始数组。在 javascript 中,array1.push('item') 将更改 array1 并返回数组的新长度。

我想利用这种代码检查:

func appendStr(str string, tail string) string 
    b := str + tail
    return b

a := "a"
appendStr(a, "b")

但是 Go 编译器没有给出错误。那么编译器会对append 方法进行一些特殊检查吗?由于 Go 是按值传递参数的,编译器应该知道appendStr 没有更改传入参数。

【问题讨论】:

【参考方案1】:

这通常在 Go 中完成的方式是使用一个额外的工具,如果你愿意的话,一个 linter。 go vet 通常用于指出代码中“看起来不正确”并且可能是错误的内容。看来你不能让它开箱即用地检查你自己的功能,只会检查fmt.Sprintf之类的东西。

另一个工具是errcheck,它报告忽略了errors。

您可以派生这些工具之一并在其中插入您自己的函数,然后让每个人在将代码提交到源代码控制之前检查他们的代码或自动检查。

【讨论】:

当然还有万能之母,github.com/alecthomas/gometalinter【参考方案2】:

append() 很特别,因为它是一个内置函数,编译器会对其进行额外检查。不使用 append() 的返回值很少有用,所以 Go 作者决定如果不使用它就将其设为编译时错误。

另一方面,调用具有返回值的“普通”函数通常会产生“副作用”,并且通常只调用函数的“副作用”而不使用其返回值。一个非常常见的例子是fmt.Println():你经常在控制台上打印一些东西,你很少(如果有的话)检查它是否成功或实际写入了多少字节。

语言规范允许你不使用函数的返回值,所以这样做是有效的,你不能强迫编译器产生错误或警告,你不能让编译器“标记”有错误的有效代码。

查看相关问题:Return map like 'ok' in Golang on normal functions

【讨论】:

以上是关于golang - 如何获得错误“已评估但未使用”的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时 golang 应用程序中获得根级别的访问/权限?

JSON文件语法验证Golang

Golang获得当前文化的小数分隔符

g——Windows下安装多版本golang

g——Windows下安装多版本golang

g——Windows下安装多版本golang