对于代码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
不会更改传递参数。
答案 0 :(得分:3)
append()
之所以特别,是因为它是一个内置函数,并且编译器会对它进行额外的检查。不使用append()
的返回值很少有用,因此Go作者决定不使用它来产生编译时错误。
另一方面,调用具有返回值的“普通”函数通常会产生“副作用”,通常仅因其“副作用”而调用函数而不使用其返回值。 fmt.Println()
是一个非常常见的示例:您经常在控制台上打印一些内容,而很少(如果有的话)检查是否成功或实际写入了多少字节。
语言规范允许您不使用函数的返回值,因此这样做是有效的,并且您不能强制编译器犯错或发出警告,您不能使编译器执行“标记带有错误的有效代码。
答案 1 :(得分:2)