当前位置: 首页 > 面试题库 >

Go编译器说“已声明且未使用”,但正在使用它们

李敏学
2023-03-14
问题内容

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

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

东西是m,,err并且key都在使用中。我无法解释为什么编译器认为您不是。


问题答案:

正如@kostix所说,m是本地范围if。试试这个代码

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


 类似资料:
  • 问题内容: 我正在学习Google的新语言Go。我只是在尝试一些东西,我注意到,如果您声明一个变量并且不对其执行任何操作,则go编译器(在我的情况下为 8g )将无法 编译,并显示以下错误:。令我惊讶的是,大多数语言编译器只是 警告 您有关未使用的变量,但仍会编译。 无论如何,我能解决这个问题吗?我检查了编译器的文档,但看不到任何会改变此行为的内容。有没有一种方法可以删除以进行编译? 问题答案:

  • 问题内容: 我收到此错误消息,说我没有使用变量……但是在我的菜鸟眼中,看起来我在: 谁能指出我对语言的缺失?我认为这与vs 和作用域有关,但我不确定。 问题答案: 在您的for循环声明了一个新的变量,其阴影外。将其变成平原以解决问题。 顺便说一下,为了获得相同的精度和更快的速度,您可以尝试以下实现,该实现一次执行两个步骤:

  • 问题内容: 我是golang的新手,我编写了一个测试io包的程序: 编译错误为“已声明并且未使用err”。但是我想我已经使用err来声明。为什么编译器会输出此错误? 问题答案: for 的内部正在遮盖for的外部,并且未被使用(for的内部)。发生这种情况的原因是,您正在使用简短的变量声明(与运算符一起使用),该声明声明了一个新变量,该新变量遮盖了for外部声明的变量。

  • 问题内容: 我偶然发现了一个奇怪的问题,下面的代码无法编译: 错误(代码是linter推荐的代码)。: 注意,确实使用了该变量。 但是,如果我添加了else块-一切都会按预期编译: 这看起来像是编译器中的错误,还是一个已知问题?任何想法?(我正在使用go 1.11) 编辑:到目前为止的所有被告。按照:https : //golang.org/ref/spec#Short_variable_decl

  • 我正在寻找关于Gradle依赖关系的信息,类似于这个问题: 什么是Gradle工件依赖关系图命令? 但范围更窄。我想知道Maven用于分析依赖项的功能,以及Gradle是否包含类似的功能。具体地说,Maven可以扫描您的源代码,然后将其与声明的依赖项进行比较,并(粗略地)确定您是否有声明为您没有使用的依赖项和/或您是否正在使用您没有声明的依赖项(由于与图灵完整性相关的问题,这种分析可能包括假阳性/

  • 问题内容: 我已经使用构建了一个简单的可执行程序。 我已经将代码编译成静态二进制程序。 我想反编译输出二进制文件并获取Go源代码。 这有可能吗? 问题答案: 没有工具可以执行此操作,并且由于Go程序已编译为机器代码,因此它们所包含的信息不足,无法将其转换回Go代码。但是,仍然可以使用标准拆卸​​技术。