Go компилятор говорит "объявлено и не используется", но они используются - PullRequest
1 голос
/ 30 мая 2011

У меня есть следующая функция, которая выдаёт мне ошибки «объявлена ​​и не используется»:

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 все используются.Я не могу понять, почему компилятор считает, что это не так.

Ответы [ 2 ]

2 голосов
/ 30 мая 2011

Как сказал @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)
}
1 голос
/ 30 мая 2011

Я думаю, что переменные, которые вы объявляете в этих ветвях if, являются локальными для блоков кода этих ветвей.Это не JavaScript (к счастью).Поэтому просто объявите свои переменные где-то выше if и используйте = вместо := для их присвоения.

...