go - 为什么编译器在这个实例中提示一个未使用的变量(当它被 fmt.Fprintf 使用时)?

标签 go

我有一段简单的代码,我想将 slice 的元素转换为 json,然后将它们打印到我的 http.responseWriter。

for _, element := range customers {
    result, _ := json.Marshal(element)
    fmt.Fprintf(w, string(result))
}

然而,当我编译它时,我收到错误“result declared and not used”。如果我添加一个简单的行:

_ = result

然后一切都可以编译并正常工作。为什么编译器会提示这种用法,在 go 中正确的做法是什么?

感谢任何见解,到目前为止,我的搜索似乎表明对 Fprintf 的调用应该算作一次使用。

最佳答案

有问题的代码不会导致发布的错误,为了证明,请在 Go Playground 上查看.

这个错误通常是(并且 op 确认在这种情况下也是如此)是由于在 block 外有一个同名的局部变量,并且在使用 short variable declaration 时引起的,这会影响该变量。

可以使用以下代码重现此错误:

var result []byte

customers := []int{}
w := os.Stdout

for _, element := range customers {
    result, _ := json.Marshal(element)
    fmt.Fprintf(w, string(result))
}

尝试编译并运行它,我们得到错误(在 Go Playground 上尝试):

prog.go:10:6: result declared and not used

解决方案是使用一个简单的 assignment如果意图是使用现有变量(在这种情况下不会创建新变量),而不是短变量声明,或者如果意图不使用外部现有变量(但随后是外部变量),则为变量使用不同的名称当然要删除或使用变量)。

关于go - 为什么编译器在这个实例中提示一个未使用的变量(当它被 fmt.Fprintf 使用时)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53198800/

相关文章:

json - 如何在golang中对特殊的json字符串进行base64编码?

go - 在每个 BookName 之后在 booksName 数组中添加分号,如何将最后一个分号更改为 (And)

json - 如何编写将 golang 结构编码为混合类型的 json 数组的 proto3 消息?

Goland 无法使用 Go 1.14 识别我的 vendor 目录

go - Logrus条目没有“缓冲区”字段

go - 为什么在使用 select 并顺序将值输入 2 个 channel 时所有 goroutine 都处于休眠状态?

go - 在 Go 中获取 channel 长度的正确方法

javascript - go - 在 Go 中合并 RethinkDB

golang 在两个 goroutine 之间同时传递结构

go - 如何从过去的某个时间开始定期启动cron作业