在并发写入CSV时,可能会遇到“切片边界超出范围”的错误。这个错误通常是由于多个并发任务同时尝试访问并修改同一个切片导致的。为了解决这个问题,可以采取以下方法:
import (
"sync"
"encoding/csv"
"os"
)
func main() {
var mutex sync.Mutex
// 创建一个CSV文件
file, err := os.Create("data.csv")
if err != nil {
panic(err)
}
defer file.Close()
writer := csv.NewWriter(file)
// 并发写入CSV
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
// 申请互斥锁
mutex.Lock()
defer mutex.Unlock()
// 写入CSV
writer.Write([]string{"data", string(i)})
writer.Flush()
}(i)
}
// 等待所有并发任务完成
wg.Wait()
}
import (
"encoding/csv"
"os"
)
func main() {
// 创建一个CSV文件
file, err := os.Create("data.csv")
if err != nil {
panic(err)
}
defer file.Close()
writer := csv.NewWriter(file)
// 创建通道
result := make(chan []string)
// 并发写入CSV
for i := 0; i < 10; i++ {
go func(i int, result chan<- []string) {
// 执行并发任务,将结果发送到通道中
result <- []string{"data", string(i)}
}(i, result)
}
// 单独的goroutine处理切片的写入操作
go func(result <-chan []string) {
for data := range result {
writer.Write(data)
writer.Flush()
}
}(result)
// 等待所有并发任务完成
for i := 0; i < 10; i++ {
<-result
}
}
这些方法可以确保在并发写入CSV时,不会出现“切片边界超出范围”的错误。通过使用互斥锁或通道来保护共享资源的访问,可以保证每个并发任务能够按顺序访问和修改切片,避免冲突和错误。
上一篇:并发下载立即结束
下一篇:并发写入共享网络资源