-1

マップのキーを使用して API から何かを要求し、API の応答に基づいて対応する値を更新したいと考えています。

私の推測では、次のコードになります。

または、このアプローチをスクラッチし、反復する前に配列内のマップキーを収集してから、配列エントリを使用してリクエストを作成し、マップを変更します

wg := &sync.WaitGroup{}
wg.Add(len(someMap))

sem := semaphore.NewWeighted(maxWorkers)
ctx := context.TODO()
mutex := &sync.RWMutex{}

mutex.RLock()
for k, v := range someMap {
    mutex.RUnlock()
    go func(k, v) {
        defer wg.Done()

        sem.Acquire(ctx, 1)
        res, err := API.REQUEST(k)
        sem.Release(1)

        if err != nil {
            return
        }

        v.SomeElement = res.SomeElement
        mutex.Lock()
        someMap[k] = v
        mutex.Unlock()
    }(k, v)
    mutex.RLock()
}
mutex.RUnlock()

wg.Wait()
4

1 に答える 1