golang - 如何获取错误 "evaluated but not used"

标签 go

对于代码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() : 你经常向控制台打印一些东西,你很少(如果有的话)检查是否成功或实际写入了多少字节。

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

参见相关问题:Return map like 'ok' in Golang on normal functions

关于golang - 如何获取错误 "evaluated but not used",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51649213/

相关文章:

json - 在 Go 中聚合 JSON 对象

json - Golang jsonable 指向 slice 中不同结构的指针

json - Go 中的函数对数据库执行选择查询并返回 json 输出

go - 如何将 exec() 与输入参数一起使用?

http - 为什么 `http`包需要地址引用?

elasticsearch - 从 Golang 查询 ElasticSearch

reflection - 获取方法参数名称

postgresql - golang postgres 连接错误太多

javascript - 去解析JWT : error verifying ID token: illegal base64 data at input byte 0

pointers - 字符串指针