内容来自对 chatgpt 的咨询
假设你有一个golang 的数组,数组元素数量大于20,你需要调用下游接口,但是接口的请求参数限制了一次最多传20个,为了节省时间,你需要并发调用,完整整个数组的下游调用,请完成代码编写
写法一
我们将数组切分成最大20个元素的小块,并对每个块并发调用下游接口:
package main
import (
"fmt"
"sync"
)
// 假设你的数组
var largeArray = []string{/* your data here */}
// 假设的下游接口调用函数,接受一个string数组作为参数
func callAPI(arr []string) {
// 你的API调用逻辑
}
func main() {
// 组定义
var wg sync.WaitGroup
chunkSize := 20
// 将大数组分解成大小最大为20的小数组
for i := 0; i < len(largeArray); i += chunkSize {
wg.Add(1) // 为每个小组添加一个等待组
end := i + chunkSize
if end > len(largeArray) {
end = len(largeArray)
}
// 启动一个并发goroutine来处理每个小数组
// 这会立即执行,i 和 end 的当前值将传递给goroutine
go func(start, end int) {
defer wg.Done() // 在goroutine结束时告知等待组
callAPI(largeArray[start:end])
}(i, end)
}
// 等待所有API调用完成
wg.Wait()
fmt.Println("All API calls completed.")
}
另一种写法
也可以利用 sliecs.ChunkEverytInt 函数把原数组按照 20 的大小切割成二维数组,每个字数组长度为 20,之后遍历这个二维数组即可。
package main
import (
"fmt"
"sync"
)
// 假设你的数组
var largeArray = []string{/* your data here */}
// 假设的下游接口调用函数,接受一个string数组作为参数
func callAPI(arr []string) {
// 你的API调用逻辑
}
func main() {
// 组定义
var wg sync.WaitGroup
chunkSize := 20
if len(largeArray) <= 0 { // ChunkEveryInt返回切片的切片,每个切片包含count个元素,其中每个新的chunk开始将step元素放入可枚举对象中。计数小于等于0时会触发 panic。
return
}
tempChunkArrs := slices.ChunkEveryInt(largeArray, 20)
// 将大数组分解成大小最大为20的小数组
for _, subArr := range tempChunkArrs {
wg.Add(1) // 为每个小组添加一个等待组
// 启动一个并发goroutine来处理每个小数组
go func() {
defer wg.Done() // 在goroutine结束时告知等待组
callAPI(subArr)
}()
}
// 等待所有API调用完成
wg.Wait()
fmt.Println("All API calls completed.")
}
特别提醒
使用 slices.ChunkEveryInt 返回切片的切片,每个切片包含count个元素,使用函数前需要判断原数组长度是否大于0,计数小于等于0时会触发 panic。
标签:20,请求,largeArray,接口,数组,end,下游,string From: https://www.cnblogs.com/hi3254014978/p/17738260.html