Search code examples
gochannelgoroutine

Spawning go routines in a loop with closure


I have a list of strings which can contain number of elements ranging from 1 to 100,000. I want to verify each string and see if they are stored in a database, which requires call to network.

In order to maximize the efficiency, I want to spawn a go routine for each element. Goal is to return false if one of the verifications inside the go routine function returns err, and return true if there is no err. So if we find at least one err we can stop since we already know that it is going to return false.

This is the basic idea, and the function below is the structure I've been thinking about using so far. I'd like to know if there is a better way (perhaps using channel?).

for _, id := range userIdList {
    go func(id string){
        user, err := verifyId(id)
        if err != nil {
            return err
        }
        // ...
        // few more calls to other APIs for verifications
        if err != nil {
            return err
        }
    }(id)
}

Solution

  • I have wrote a small function that might be helpful for you. Please take a look at limited parallel operations