Heim >Backend-Entwicklung >Golang >Warum kennzeichnet mein Go-Compiler Variablen als nicht verwendet, wenn sie eindeutig verwendet werden?

Warum kennzeichnet mein Go-Compiler Variablen als nicht verwendet, wenn sie eindeutig verwendet werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-17 11:34:24639Durchsuche

Why Does My Go Compiler Flag Variables as Unused When They Are Clearly Used?

Compiler kennzeichnet Variable als nicht verwendet, wenn sie verwendet wird

In Go kann es zu Fehlern mit der Meldung „deklariert und nicht verwendet“ kommen, selbst wenn Die betreffenden Variablen werden offensichtlich genutzt. Das kann verwirrend sein, aber die Lösung liegt oft im Verständnis des Variablenbereichs.

Ein solcher Fehler ist in der folgenden Funktion aufgetreten:

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

Der Compiler hat m und err trotzdem als nicht verwendet gekennzeichnet ihre offensichtliche Verwendung. Der Schlüssel zur Lösung dieses Problems besteht darin, zu erkennen, dass die Variable m innerhalb der if-Anweisung einen Gültigkeitsbereich hat. Um m außerhalb dieses Bereichs zu verwenden, muss es auf Funktionsebene deklariert werden.

Der folgende überarbeitete Code behebt dieses Problem:

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: m is now declared at the function level
  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)
}

Das obige ist der detaillierte Inhalt vonWarum kennzeichnet mein Go-Compiler Variablen als nicht verwendet, wenn sie eindeutig verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn