我有一段简单的代码,我想将切片的元素转换为json,然后将其打印到我的http.responseWriter中。
for _, element := range customers {
result, _ := json.Marshal(element)
fmt.Fprintf(w, string(result))
}
但是,当我对此进行编译时,出现错误“结果已声明且未使用”。如果我添加一条简单的行:
_ = result
然后一切都可以编译并正常运行。为何编译器会抱怨这种用法?执行此操作的正确方法是什么?
任何见解都会受到赞赏,到目前为止,我的搜索似乎表明对Fprintf的调用应该算作一种用法。
答案 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而不是短变量声明,或者如果打算使用现有变量,则使用其他名称就是不要使用现有的外部变量(但是外部变量将被删除或被使用)。