golang - 如何收到错误“已评估但未使用”

fkp*_*olf 4 go

对于代码append(slice1, 1),Go 编译会给出错误“append(...)valuedbutnotused”。我们必须使用like,slice1 = append(slice1,1)因为append不修改slice1并且它将返回一个新的切片。

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

我想利用这种代码检查:

func appendStr(str string, tail string) string {
    b := str + tail
    return b
}
a := "a"
appendStr(a, "b")
Run Code Online (Sandbox Code Playgroud)

但是Go编译器没有报错。append那么编译器会对方法进行一些特殊检查吗?由于 Go 按值传递参数,编译器应该知道appendStr修改传入参数没有任何变化。

icz*_*cza 5

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

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

语言规范允许您不使用函数的返回值,因此这样做是有效的,并且您不能强迫编译器从中产生错误或警告,您不能使编译器“标记”有效代码有错误。

请参阅相关问题:Return map like 'ok' in Golang on Normal Functions