【问题标题】:Go compiler says "declared and not used" but they are being usedGo 编译器说“已声明且未使用”,但它们正在被使用
【发布时间】:2011-05-30 14:55:01
【问题描述】:

我有以下函数给我“已声明但未使用的变量”错误:

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)
}

它给了我以下错误:

dpcompare.go:171: m declared and not used
dpcompare.go:171: err declared and not used
dpcompare.go:173: m declared and not used
dpcompare.go:173: err declared and not used
dpcompare.go:178: undefined: m
dpcompare.go:185: key declared and not used

问题是merrkey 都在使用。我无法理解为什么编译器认为你不是。

【问题讨论】:

  • 错误消息说明了整个故事。 m 在第 171 行和第 173 行都声明了,因此它们必须是 m 的不同实例,并且也不同于第 178 行上的实例,这是未定义的。同样,err 在第 171 行和第 173 行声明,因此它们不能是先前在第 167 行声明的 err 实例。如果将声明的变量与相同名称相乘,您将在 C++、C99 或 Java 中得到类似的消息。

标签: compiler-errors go


【解决方案1】:

正如@kostix 所说,mif 的范围内是本地的。试试这个代码

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)
}

【讨论】:

  • 非常感谢。这大部分解决了我的问题。我仍然收到有关密钥的错误。键是否可能是保留字?密钥只在一个范围内使用...
  • 没关系。关键错误完全是pebkac。非常感谢!!
【解决方案2】:

我认为您在那些 if 分支中声明的变量对于这些分支的代码块来说是本地的。这不是 JavaScript(幸运的是)。因此,只需在 if 上方的某处声明您的变量,然后使用 = 而不是 := 来分配它们。

【讨论】:

  • 简单赋值使用"="; ":=" 是一个初始化声明,所以 "x := 0" 表示 "var x = 0"。
猜你喜欢
  • 2023-03-19
  • 1970-01-01
  • 2010-12-15
  • 2012-06-24
  • 2018-03-29
  • 2015-08-12
  • 2021-12-14
  • 1970-01-01
  • 2021-05-07
相关资源
最近更新 更多