直接上代码
package main
import (
"fmt"
"strconv"
"sync"
"time"
)
type user struct {
id int
name string
}
func main() {
users := make([]user, 5)
for i := 0; i < 5; i++ {
users[i] = user{i, "name" + strconv.Itoa(i)}
}
wg := &sync.WaitGroup{}
wg.Add(10)
// 传递user指针协程里打印出来的是同一user
for _, u := range users {
go handleUserPointer(&u, wg)
}
time.Sleep(time.Second)
// 传递值正常
for _, u := range users {
go handleUserValue(u, wg)
}
wg.Wait()
}
// 指针传递
func handleUserPointer(user *user, wg *sync.WaitGroup) {
fmt.Println(user)
time.Sleep(time.Millisecond * 200)
wg.Done()
}
// 值传递
func handleUserValue(user user, wg *sync.WaitGroup) {
fmt.Println(user)
time.Sleep(time.Millisecond * 200)
wg.Done()
}
输出结果
&{4 name4}
&{4 name4}
&{4 name4}
&{4 name4}
&{4 name4}
{0 name0}
{1 name1}
{4 name4}
{3 name3}
{2 name2}
在for range
里面启协程处理,传递user指针总是同一个,请问这是什么原因?
哈,我也是了解了一下才知道..
u
一直是u
,但指向的值不停地在变化。go routine启动太慢啦,要是多加个延时,还发现不了呢...