Go 未声明变量,在if..else语句中

Go 未声明变量,在if..else语句中,go,global-variables,Go,Global Variables,我刚刚开始学习go-lang,我对在go-lang中声明变量感到困惑 例如,我在if…else语句中声明了req,er 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) }

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

例如,我在if…else语句中声明了
req
er

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

如果语句不起作用,我在里面声明的内容似乎都一样。。。如何解决它?

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

package main

import "fmt"

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

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

这:

相当于:

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-else
条件内声明了变量
req
er
,并试图在范围外使用它(范围只是声明它们的
if
else


您需要在
if-else

之外声明
er
req
if-else

我对
go
知之甚少,但是如果您在if语句之前声明
req
er
,并在if语句中分配它们,那么警告(它们是警告还是错误?)应该离开。在go中,将错误结果命名为
err
,而不是
er
,这是一种习惯用法。谢谢您的回复,那么我如何才能将变量传递出范围?您不必传递任何内容,只需在正确的位置声明即可。谢谢!这就是我想要的!我会接受答案的。谢谢你的帮助!!这太愚蠢了,我总是需要
如果a,err:=xxx();呃=nil{return err}a.yyy()
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)
    }
}