方法1 执行加锁操作
func main() {
var(
slice1=[]int{}
n=1000
wg=sync.WaitGroup{} //用于控制goroutine在main线程执行完之前执行
lock=sync.Mutex{} //用于slice并发操作的锁
)
wg.Add(n)
for i:=0;i<n;i++{
go func(a int) {
defer wg.Done()
lock.Lock() //对操作slice执行加锁操作
defer lock.Unlock()
slice1=append(slice1,a)
}(i) //这里也需要注意,要对i进行值的复制
}
wg.Wait()
fmt.Printf("len of slice is:%v",len(slice1))
}
方法2 使用channel
func main2() {
var (
slice1 = []int{}
n = 1000
wg = sync.WaitGroup{}
c = make(chan int)
)
wg.Add(n)
for i := 0; i < n; i++ {
go func(a int) {
c <- a
wg.Done()
}(i)
}
go func() {
wg.Wait()
close(c)
}()
// 等待关闭channel
for i := range c {
slice1 = append(slice1, i)
}
fmt.Printf("len of slice is:%v", len(slice1))
}
方法3
func main() {
var (
slice1 = []int{}
n = 1000
c = make(chan int, n)
)
for i := 0; i < n; i++ {
go func(a int) {
c <- a
}(i)
}
for i := 0; i < n; i++ { //在这里阻塞实现 等待n个协程执行完毕
slice1 = append(slice1, <-c)
}
fmt.Printf("len of slice is:%v\n", len(slice1))
for _, v := range slice1 {
fmt.Printf("value:%v\n", v)
}
}