为什么编译器会在此实例中抱怨一个未使用的变量(当fmt.Fprintf使用它时)?

时间:2018-11-07 22:24:32

标签: go

我有一段简单的代码,我想将切片的元素转换为json,然后将其打印到我的http.responseWriter中。

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

但是,当我对此进行编译时,出现错误“结果已声明且未使用”。如果我添加一条简单的行:

_ = result

然后一切都可以编译并正常运行。为何编译器会抱怨这种用法?执行此操作的正确方法是什么?

任何见解都会受到赞赏,到目前为止,我的搜索似乎表明对Fprintf的调用应该算作一种用法。

1 个答案:

答案 0 :(得分:2)

有问题的代码不会导致发布错误,为证明起见,请在Go Playground上进行检查。

此错误通常是由于(并且操作员确认在这种情况下也是如此)是由在块外具有相同名称的局部变量引起的,并且在使用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而不是短变量声明,或者如果打算使用现有变量,则使用其他名称就是不要使用现有的外部变量(但是外部变量将被删除或被使用)。

相关问题