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

时间:2018-08-02 08:40:45

标签: go

对于代码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方法进行一些特殊检查吗?由于可以按值传递参数,因此编译器应该知道appendStr不会更改传递参数。

2 个答案:

答案 0 :(得分:3)

append()之所以特别,是因为它是一个内置函数,并且编译器会对它进行额外的检查。不使用append()的返回值很少有用,因此Go作者决定不使用它来产生编译时错误。

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

语言规范允许您不使用函数的返回值,因此这样做是有效的,并且您不能强制编译器犯错或发出警告,您不能使编译器执行“标记带有错误的有效代码。

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

答案 1 :(得分:2)

通常在Go中完成此操作的方式是使用一个额外的工具,如果需要的话,可以使用linter。 go vet通常用于指出代码中“看起来不正确”且可能是错误的内容。看来您无法让它立即检查您自己的功能,只会检查fmt.Sprintf之类的东西。

另一个工具是errcheck,该工具报告了被忽略的error

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