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存储的值不符合预期的问题

posted @ 2022-08-15 20:30  随风而行-  阅读(414)  评论(0编辑  收藏  举报