ホームページ >バックエンド開発 >Golang >変数が使用されているにもかかわらず、Go コードで「変数が宣言され、使用されていません」というエラーが発生するのはなぜですか?

変数が使用されているにもかかわらず、Go コードで「変数が宣言され、使用されていません」というエラーが発生するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-14 22:18:19432ブラウズ

Why Does My Go Code Produce

実際の使用にもかかわらず 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:

  • dpcompare.go:171: m は宣言されていますが使用されていません
  • dpcompare.go:171: err は宣言されていますが使用されていません
  • dpcompare.go:173 : m は宣言されていますが、使用されていません
  • dpcompare.go:173: err 宣言されており、使用されていません
  • dpcompare.go:178: 未定義: m
  • dpcompare.go:185: キーは宣言されていますが、使用されていません

ただし、クロージャ時に調べてみると、変数 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。