下面是一个使用100个goroutine处理长度为10000的slice的示例代码:
package main
import (
	"fmt"
	"sync"
)
func processSlice(slice []int, wg *sync.WaitGroup) {
	defer wg.Done()
	for i := range slice {
		slice[i] = slice[i] * 2
	}
}
func main() {
	var wg sync.WaitGroup
	sliceLength := 10000
	numGoroutines := 100
	slice := make([]int, sliceLength)
	// 初始化slice
	for i := range slice {
		slice[i] = i + 1
	}
	// 每个goroutine处理的slice长度
	chunkSize := sliceLength / numGoroutines
	// 启动goroutine
	for i := 0; i < numGoroutines; i++ {
		wg.Add(1)
		startIndex := i * chunkSize
		endIndex := (i+1)*chunkSize - 1
		go processSlice(slice[startIndex:endIndex+1], &wg)
	}
	// 等待所有goroutine完成
	wg.Wait()
	// 打印结果
	fmt.Println(slice)
}
该程序创建了一个长度为10000的整数slice,并使用100个goroutine并行地将每个元素乘以2。主函数使用sync.WaitGroup等待所有goroutine完成,然后打印结果。
在启动goroutine之前,主函数将slice分成了100个块,每个goroutine处理其中的一块。这样做是因为goroutine的数量比CPU核心的数量多得多,因此如果每个goroutine都操作整个slice,可能会导致竞争条件和性能问题。将slice分成块可以确保每个goroutine只处理自己负责的那一部分数据,避免了竞争条件。
请注意,这里使用defer wg.Done()在goroutine完成时递减WaitGroup计数器。这样做可以确保即使goroutine发生异常,也不会阻塞主线程等待所有goroutine完成。


        
        
        
        
        
        
        
        
        
        
                
                
                
                
                
                
                