resp声明并且不在golang中使用

时间:2014-07-27 13:13:07

标签: go

每次尝试运行代码时都会出现此错误。 我不确定如何在go中使用未使用的变量以及如何在不使用未使用的变量的情况下使代码工作。我必须删除if-else语句才能发布此问题。问题是这样的:     if(case1)调用一个url     否则if(case2)调用另一个url     别叫另一个网址。

感谢您的帮助。我尝试了各种黑客,但似乎都没有。

package main

import (
    "fmt"
    "math/rand"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    rage := rand.Int31() % 3
    var resp *Response
    if rage == 1 {
        resp, _ := http.Get("https://maps.googleapis.com/maps/api/place/textsearch/json?            query=restaurants+in+Sydney&key=AIzaSyAh4t-qlMYrxnk0XF0Yiu9ZXVFDNfPTCFs")
    } else {
        resp, _ := http.Get("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-33.8670522,151.1957362&radius=500&types=food&name=cruise&key=AIzaSyAh4t-qlMYrxnk0XF0Yiu9ZXVFDNfPTCFs")
    }
    defer resp.Body.Close()
    body, _ := ioutil.ReadAll(resp.Body)
    resp = unused.Item
    fmt.Println("Inside handler")
    fmt.Fprintf(w, string(body), nil)
}

func main() {
    http.HandleFunc("/", handler)
    http.ListenAndServe("localhost:9999", nil)
}

Output:
C:\go\gowiki\websrevice_citibytes_SOAP.go:233: resp declared and not used
C:\go\gowiki\websrevice_citibytes_SOAP.go:235: resp declared and not used
C:\go\gowiki\websrevice_citibytes_SOAP.go:237: resp declared and not used

2 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误:

var resp *Response应为var res *http.Response

如果您想使用其import "io/ioutil"功能,则应ReadAll

什么是resp = unused.Item?它应该删除。

修复所有这些内容后,正如其他评论所说:删除分配给resp的行中的:

resp, _ := http.Get("...") - > resp, _ = http.Get("...")

错误是使用:=创建了一个新变量resp,它会覆盖前一个变量并且只存在于if范围内。

正如其他人所说,最好只使用带有url的字符串变量,并使用if来设置该变量。

var url string = url1
if cond {
  url = url2
}
resp, err := http.Get(url)

此外,不要忽略错误

答案 1 :(得分:0)

Golang开发团队负责人这些奇怪的局限性令人讨厌。

为什么不让人们禁用带有选项的限制?

答案很简单:他们为自己(为guugle)而不是为社区写语言。

幸运的是,Go是开源的,甚至是用Go编写的。

因此,这是一个简单的补丁程序,它消除了引发“已声明且未使用”或“已声明但未使用”的错误:

diff --git a/src/cmd/compile/internal/gc/walk.go b/src/cmd/compile/internal/gc/walk.go
index 770210f..78c0cbc 100644
--- a/src/cmd/compile/internal/gc/walk.go
+++ b/src/cmd/compile/internal/gc/walk.go
@@ -49,10 +49,7 @@ func walk(fn *Node) {
                        if defn.Left.Name.Used() {
                                continue
                        }
-                       yyerrorl(defn.Left.Pos, "%v declared and not used", ln.Sym)
                        defn.Left.Name.SetUsed(true) // suppress repeats
-               } else {
-                       yyerrorl(ln.Pos, "%v declared and not used", ln.Sym)
                }
        }

diff --git a/src/go/types/stmt.go b/src/go/types/stmt.go
index abd9d05..8b15786 100644
--- a/src/go/types/stmt.go
+++ b/src/go/types/stmt.go
@@ -55,6 +55,7 @@ func (check *Checker) funcBody(decl *declInfo, name string, sig *Signature, body
 }

 func (check *Checker) usage(scope *Scope) {
+       return
        var unused []*Var
        for _, elem := range scope.elems {
                if v, _ := elem.(*Var); v != nil && !v.used {

(go1.12的实际值)

将新的Golang解压缩到/ usr / local / go中并应用补丁。

然后编译:

export GOROOT_BOOTSTRAP=/usr/local/go2
cp -a /usr/local/go /usr/local/go2
cd /usr/local/go/src
sed -e 's#^bash run.bash.*##' -i all.bash
./all.bash
rm -rf /usr/local/go2
unset GOROOT_BOOTSTRAP

[每个新版本]一次应用补丁比每次处理每个遗漏变量要快得多。

相关问题