golang 运算符 := 特殊用法
:= 对于a:=b,b为非指针类型的变量是一个深拷贝(deep copy) ,对于b为指针的情况,是一个浅拷贝(shadow copy)
package main
import "fmt"
type Foo struct {
foo_name string
bar Bar
}
type Bar struct {
boo_name string
}
func main() {
a := Foo{foo_name: "foo", bar: Bar{boo_name: "boo"}}
b := a
b.bar.boo_name = "boo_b"
a.foo_name = "foo_a"
a.bar.boo_name = "boo_a"
fmt.Println(a) // {foo_a {boo_a}}
fmt.Println(b) // {foo {boo_b}}
fmt.Println(a == b) // false
}
从上面可以看到,经过b:=a
后,对于a的值的修改不会影响到b中的所有值,从而说明b来自于a的拷贝,并且完全独立
应用
对于进行遍历和需要存储其值的逻辑时,可以使用
for _, tmp := range xx{
val := tmp
if bool_x{
res = append(res, val)
}
}
来避免range语句中使用共享地址,导致res存储的值不符合预期的问题
内容来自博客园,拒绝爬虫网站