测试的时候发现一个有意思的地方,就是go始终利用同一块内存来接收集合中的一个值,只是在每次循环的时候重新赋值而已。
package main
import (
"fmt"
"time"
)
func main() {
ii := []int{ 1, 2, 3, 4, 5}
for idx, i := range ii {
fmt.Printf("[%d]: [%d]@ %p -->%p\n", idx, i, &i, &(ii[idx])) //结论是,&i始终不变!
}
uu := []user{user{ 1, "aaa"}, user{ 2, "bbb"}, user{ 3, "ccc"}, user{ 4, "ddd"}}
for idx, i := range uu {
fmt.Printf("[%d]: [%v]@ %p -->%p\n", idx, i, &i, &(uu[idx])) //结论是,&i始终不变!而且,值正常,说明空间是重复利用。
}
//怎么验证呢?需要监控数据的变化,反射吗?不用,goroutine时刻对比就行 - 虽然性能极低
var u *user
go func() {
id := u.id
name := u.name
for {
if id != u.id {
fmt.Println("id changed!", id, "to", u.id) //通过这个的变化,来观察是否有清零过程 - 结论是没有
id = u.id
}
if name != u.name {
fmt.Println("name changed!", name, "to", u.name) //通过这个的变化,来观察是否有清零过程 - 结论是没有
name = u.name
}
}
}()
for idx, i := range uu {
if idx == 0 {
u = &i
}
fmt.Printf("[%d]: [%v]@ %p -->%p\n", idx, i, &i, &(uu[idx])) //结论是,&i始终不变!而且,值正常,说明空间是复利用。
time.Sleep(time.Second)
}
}
type user struct {
id int
name string
}