実際の使用にもかかわらず 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) }
エラーinclude:
ただし、クロージャ時に調べてみると、変数 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 を関数スコープ変数にすることで、関数全体でアクセスして使用できるようになり、「宣言されているものとそうでないもの」の問題が解決されます。 used」エラー。
以上が変数が使用されているにもかかわらず、Go コードで「変数が宣言され、使用されていません」というエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。