儘管實際使用,Go 編譯器仍出現「變數已宣告但未使用」錯誤
Go中的以下函數會產生「變數已宣告但未使用」錯誤:
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) }
錯誤包含:
但是,在接近時檢查後,很明顯變數m、err 和key 確實被
原因和解決方案
正如@kostix所指出的,問題在於m的範圍。在給定的程式碼中,m 在 if 和 else 語句的範圍內宣告。為了解決這個問題,m 的聲明應該移到這些區塊之外:
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) }
透過使m 成為函數範圍的變量,可以在整個函數中存取和使用它,解決了「聲明而不是聲明」的問題。使用”錯誤。
以上是為什麼我的 Go 程式碼即使使用了變數也會產生「變數已宣告但未使用」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!