对于代码append(slice1, 1)
,Go编译会报错“append(...) evaluated but not used”。我们必须像 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 是传值传参,Compiler 应该知道 appendStr
没有变化来修改传参。
最佳答案
append()
是特殊的,因为它是一个内置函数,编译器会对其进行额外检查。不使用 append()
的返回值是很少有用的,因此 Go 作者决定如果不使用它,则将其设为编译时错误。
另一方面,调用具有返回值的“普通”函数通常会产生“副作用”,通常只调用一个函数来获得“副作用”而不使用它的返回值。一个很常见的例子是 fmt.Println()
: 你经常向控制台打印一些东西,你很少(如果有的话)检查是否成功或实际写入了多少字节。
语言规范允许你不使用函数的返回值,所以这样做是有效的,你不能强制编译器产生错误或警告,你不能让编译器“标记”错误的有效代码。
关于golang - 如何获取错误 "evaluated but not used",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51649213/