尽管实际使用,Go 编译器仍出现“变量已声明但未使用”错误
Go 中的以下函数会产生“变量已声明但未使用”错误:
type Comparison struct { Left []byte Right []byte Name string } func img(w http.ResponseWriter, r *http.Request, c appengine.Context, u *user.User) { key := datastore.NewKey("Comparison", r.FormValue("id"), 0, nil) side := r.FormValue("side") comparison := new(Comparison) err := datastore.Get(c, key, comparison) check(err) if side == "left" { m, _, err := image.Decode(bytes.NewBuffer(comparison.Left)) } else { m, _, err := image.Decode(bytes.NewBuffer(comparison.Right)) } check(err) w.Header().Set("Content-type", "image/jpeg") jpeg.Encode(w, m, nil) }
错误包括:
但是,在接近时检查后,很明显变量 m、err 和 key 确实被
原因和解决方案
正如@kostix指出的,问题在于m的范围。在给定的代码中,m 在 if 和 else 语句的范围内声明。为了解决这个问题,m 的声明应该移到这些块之外:
type Comparison struct { Left []byte Right []byte Name string } func img(w http.ResponseWriter, r *http.Request, c appengine.Context, u *user.User) { key := datastore.NewKey("Comparison", r.FormValue("id"), 0, nil) side := r.FormValue("side") comparison := new(Comparison) err := datastore.Get(c, key, comparison) check(err) // NOTE! now m is in the function's scope var m Image if side == "left" { m, _, err = image.Decode(bytes.NewBuffer(comparison.Left)) } else { m, _, err = image.Decode(bytes.NewBuffer(comparison.Right)) } check(err) w.Header().Set("Content-type", "image/jpeg") jpeg.Encode(w, m, nil) }
通过使 m 成为函数范围的变量,可以在整个函数中访问和使用它,解决了“声明而不是声明”的问题。使用”错误。
以上是为什么我的 Go 代码即使使用了变量也会产生'变量已声明但未使用”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!