条件ステートメント内で宣言された変数
条件ステートメント (if...else) 内で宣言された変数が宣言されないという問題が発生しました。認識された。これは、Go の変数には特定のスコープがあり、変数が宣言されているブロックによって定義されるためです。
変数スコープ
この例では、次のように宣言しています。条件文の分岐内の req と er。ただし、これは、これらの変数が特定のブランチ内でのみ表示されることを意味します。 Go では、使用するスコープ内で変数を宣言する必要があります。
解決策
この問題を解決するには、条件文の外側で req と er を宣言します。それらが関数全体で表示されること:
var req *http.Request var er error if strings.EqualFold(r.Method, "GET") || strings.EqualFold(r.Method, "") { req, er = http.NewRequest(r.Method, r.Uri, b) } else { req, er = http.NewRequest(r.Method, r.Uri, b) } if er != nil { // we couldn't parse the URL. return nil, &Error{Err: er} } // add headers to the request req.Host = r.Host req.Header.Add("User-Agent", r.UserAgent) req.Header.Add("Content-Type", r.ContentType) req.Header.Add("Accept", r.Accept) if r.headers != nil { for _, header := range r.headers { req.Header.Add(header.name, header.value) } }
構文
Go における = と := の違いは重要です。 = は既存の変数に値を代入するために使用され、:= は同じ行で変数の宣言と代入に使用されます。
これは、= を使用して変数を宣言する場合は、すでに宣言している必要があることを意味します。同じスコープまたは親スコープ内にありますが、:= は 1 つのステートメントで変数の宣言と初期化を行います。
この場合、関数内に新しい変数を導入したいので、:=使用する適切な構文です。
以上がGo の条件文内で宣言された変数にアクセスできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。