我已经编写了一些代码,用于按照一本名为The Go Programming Language的书的指南打印在URL中找到的内容.编译器抱怨以下代码no new variables on left side of :=
.
package main import ( "fmt" "net/http" "os" "io" ) func main() { for _, url := range os.Args[1:] { resp, err := http.Get(url) if err != nil { fmt.Fprintf(os.Stderr, "fetch: %v\n", err) os.Exit(1) } _, err := io.Copy(os.Stdout, resp.Body) resp.Body.Close() if err != nil { fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err) os.Exit(1) } } }
我知道这是由重新声明某些变量引起的.而下面的一个通过了汇编.
package main import ( "fmt" "io/ioutil" "net/http" "os" ) func main() { for _, url := range os.Args[1:] { resp, err := http.Get(url) if err != nil { fmt.Fprintf(os.Stderr, "fetch: %v\n", err) os.Exit(1) } b, err := ioutil.ReadAll(resp.Body) resp.Body.Close() if err != nil { fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err) os.Exit(1) } fmt.Printf("%s", b) } }
它没有重新声明变量err
吗?那它怎么能通过汇编呢?
如果赋值中有任何新变量(例如b
),那么:=将创建它.如果所有变量都不是新变量,那么您将收到错误._
不是一个新变量.
由于您拥有所有现有变量,因此可以使用=作为您的io行:
_, err = io.Copy(os.Stdout, resp.Body)
当你使用b
而不是_
then:=声明b
但被视为err
标准赋值(即就像使用了a =)