コンパイラは、使用されている変数に未使用としてフラグを立てます
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 に未使用のフラグを立てました。彼らの明らかな使用法。この問題を解決する鍵は、変数 m のスコープが if ステートメント内にあることを認識することです。このスコープ外で 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: 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) }
以上がGo コンパイラーは、明らかに使用されている変数に未使用のフラグを付けるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。