go词汇导入了 := 协助开发人员加速调用两个表达式,省却了 var URL。但这儿也会有初学者经常碰到的坑。
比如说上面标识符
package main import ( “fmt” ) func main() { vardata []string data, err := getData() //特别注意这儿用的是:= if err != nil { panic(“ERROR!”) } for _, item := rangedata { fmt.Println(item) } }func getData() ([]string, error) { return []string{“there”,“are”,“no”,“strings”,“on”,“me”}, nil }输入的结论是
there are no strings on me尽管data 早已新闻稿了,但虽然err consideration,依然能采用此种句法。但这只是故事的开始,我们改一下标识符,修改一下 main 方法。
func main() { var data []string killswitch := os.Getenv(“KILLSWITCH”) if killswitch == “”{ fmt.Println(“kill switch is off”) data, err := getData() //特别注意这儿 if err != nil { panic(“ERROR!”) } fmt.Printf(“Data was fetched! %d\n”, len(data)) } for _, item := rangedata { fmt.Println(item) } }再次执行一下:
kill switch is off Data was fetched! 6是不是很奇怪,明明 len 是 6 ,但for range 打印却是空。
这就是因为在 if 空间内采用 data, err := getData() ,这儿的 data 是重新定义的,覆盖了外面的定义的 data。但标识符走出 if 后,又回到了外面data 的作用域,所以打印的是空。解决这个问题的办法是将 := 改成 = 。如下
func main() { var data []string var err error // Declaring err to make sure we can use = instead of := killswitch := os.Getenv(“KILLSWITCH”) if killswitch == “” { fmt.Println(“kill switch is off”) data, err = getData() if err != nil { panic(“ERROR!”) } fmt.Printf(“Data was fetched! %d\n”, len(data)) } for _, item := range data { fmt.Println(item) } }这样就能正确地打印了
kill switch is off Data was fetched! 6 there are no strings on me