【问题标题】:Variable not declared, inside a if..else statement在 if..else 语句中未声明变量
【发布时间】:2019-01-08 03:55:27
【问题描述】:

我刚开始学习go lang,我对在go lang中声明变量感到困惑

例如,我在 if...else 语句中声明了 reqer

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)
    }
}

但我从终端收到错误

./goreq.go:127: req declared and not used
./goreq.go:127: er declared and not used
./goreq.go:129: req declared and not used
./goreq.go:129: er declared and not used

似乎我在 If 语句中声明的任何内容都不起作用...我该如何解决?

【问题讨论】:

  • 我对@9​​87654325@了解不多,但是如果您在if语句之前声明reqer并在if语句中分配它们,那么警告(是他们是警告还是错误?)应该消失。
  • 在 Go 中,将错误结果命名为 err 而不是 er 是惯用的

标签: go global-variables


【解决方案1】:

因为变量只定义在它们被声明的范围内:

package main

import "fmt"

func main() {
    a := 1
    fmt.Println(a)
    {
        a := 2
        fmt.Println(a)
    }
    fmt.Println(a)
}

go play

=:=的区别在于=只是赋值,:=是变量声明和赋值的语法

这个:

a := 1

相当于:

var a int
a = 1

你可能想要的是:

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)
    }
}

【讨论】:

  • 感谢您的回复,那么我怎样才能将变量传递到范围之外呢?
  • 你不需要传递任何东西,你只需要在正确的地方声明它们
  • 谢谢!这就是我要的!我会接受答案。感谢您的帮助!
  • 太笨了,我一直需要if a,err:=xxx();err!=nil {return err} a.yyy()
【解决方案2】:

这是因为您在 if else 条件内声明了变量 reqer 并试图在范围之外使用它(范围只是它们所在的 ifelse声明)。

你需要在if else之外声明erreq

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 2022-10-13
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多