hernan43
hernan43

Reputation: 805

Go compiler says "declared and not used" but they are being used

I have the following function that is giving me "variable declared and not used" errors:

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

It gives me the following errors:

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

The thing is m, err, and key are all being used. I can't wrap my head around why the compiler thinks thy are not.

Upvotes: 4

Views: 7947

Answers (2)

Elazar Leibovich
Elazar Leibovich

Reputation: 33593

As @kostix said, m is local to the scope of the if. Try this code

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

Upvotes: 5

kostix
kostix

Reputation: 55453

I think the variables you declare in those if branches are local to the code blocks of these branches. This is not JavaScript (luckily). So just declare your variables somewhere above if and use = instead of := to assign to them.

Upvotes: 2

Related Questions