我已经编写了一些代码,用于按照名为 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
吗?那它怎么能通过汇编呢?
答案 0 :(得分:6)
如果作业中有任何新变量(例如b
),则:=将创建它。如果所有变量都不是新的,那么您将收到您正在获得的错误。 _
不是新变量。
由于您拥有所有现有变量,因此可以使用=作为您的io行:
_, err = io.Copy(os.Stdout, resp.Body)
当您使用b
代替_
时,则:=声明b
但处理err
就像标准分配一样(即就像使用a =一样)
答案 1 :(得分:2)
它没有
只要左侧至少有一个新变量,其他变量已经在同一个块中声明了相同的类型,就可以使用:=
。已经声明的变量只会改变它们的值。这基本上是为了方便。
这里全部描述:https://golang.org/ref/spec#Short_variable_declarations