在 go 语言中,= 是赋值, := 是声明变量并赋值。
“:=”只能用在函数体中。它的一个重要用途是用在“if”,“for”和“switch”语句的初始化,使变量成为一个“临时变量”,也就是变量的作用域仅限于这条语句。如下例所示:
package main
import "fmt"
func main() {
for j := 3; j <= 5; j++ {
fmt.Println(j)
}
fmt.Println(j)
}
上述代码会造成编译错误,提示 undefined j
。但如果在for
前面加入对 j
的声明:
package main
import "fmt"
func main() {
//var j int = 1
j := 1
for j := 3; j <= 5; j++ {
fmt.Println(j)
}
fmt.Println(j)
}
无论是以 var j int =1
还是j :=1
声明,输出都是
3
4
5
1
之所以会注意到这个问题是在下面这个例子中,看到第二个循环中 a 的值是从0 开始的
func main() {
var b int = 15
var a int
for a := 0; a < 10; a++ {
fmt.Printf("a 的值为: %d\n", a)
}
for a < b {
a++
fmt.Printf("a 的值为: %d\n", a)
}
所以总结下来便是, 在 for 循环中即使使用了:=
声明了一个与之前声明过的变量同名的变量,在 for 中声明的变量也只是个局部变量,不会影响 for 外面变量的值
在 go 的 for 循环中,有一种是以如下方式进行的,结合上面对:=
讨论可知,下面的 value 只是对dataset 中元素的值的复制,不是元素本身
for key, value := range dataset {
}
具体可见下面这个例子
package main
import "fmt"
func main() {
a := []string{}
a = append(a, "hello")
a = append(a, ", ")
a = append(a, "world")
fmt.Println(a)
for i := 0; i < len(a); i++ {
fmt.Println(&a[i])
}
fmt.Println("------------")
for _, aa := range a {
aa += "@"
fmt.Println(&aa)
}
fmt.Println("------------")
for i := 0; i < len(a); i++ {
a[i] += "@"
fmt.Println(&a[i])
}
fmt.Println("------------")
fmt.Println(a)
}
输出为
[hello , world]
0xc042044080
0xc042044090
0xc0420440a0
------------
0xc04203c1f0
0xc04203c1f0
0xc04203c1f0
------------
0xc042044080
0xc042044090
0xc0420440a0
------------
[hello@ , @ world@]