golang 代码实现:并发请求下游接口,下游接口限制请求参数中某数组单次最多传20个...

内容来自对 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值