如何限制goroutine

I'm developing a gmail client based on google api.

I have a list of labels obtained through this call

r, err := s.gClient.Service.Users.Labels.List(s.gClient.User).Do()

Then, for every label I need to get details

for _, l := range r.Labels {
    d, err := s.gClient.Service.Users.Labels.Get(s.gClient.User, l.Id).Do()
}

I'd like to handle the loop in a more powerful way so I have implemented a goroutine in the loop:

ch := make(chan label.Label)

for _, l := range r.Labels {

    go func(gmailLabels *gmailclient.Label, gClient *gmail.Client, ch chan<- label.Label) {

        d, err := s.gClient.Service.Users.Labels.Get(s.gClient.User, l.Id).Do()

        if err != nil {
            panic(err)
        }

        // Performs some operation with the label `d`
        preparedLabel := ....

        ch <- preparedLabel

    }(l, s.gClient, ch)
}

for i := 0; i < len(r.Labels); i++ {
    lab := <-ch
    fmt.Printf("Processed %v
", lab.LabelID)
}

The problem with this code is that gmail api has a rate limit, so, I get this error:

panic: googleapi: Error 429: Too many concurrent requests for user, rateLimitExceeded

What is the correct way to handle this situation?

How about only starting e.g. 10 goroutines and pass the values in from one for loop in another go routine. The channels have a small buffer to decrease synchronisation time.

chIn := make(chan label.Label, 20)
chOut := make(chan label.Label, 20)

for i:=0;i<10;i++ {
    go func(gClient *gmail.Client, chIn chan label.Label, chOut chan<- label.Label) {

        for gmailLabels := range chIn {
            d, err := s.gClient.Service.Users.Labels.Get(s.gClient.User, l.Id).Do()

            if err != nil {
                panic(err)
            }

            // Performs some operation with the label `d`
            preparedLabel := ....

            chOut <- preparedLabel

        }

    }(s.gClient, chIn, chOut)

}

go func(chIn chan label.Label) {
    defer close(chIn)
    for _, l := range r.Labels {
        chIn <- l
    }
}(chIn)

for i := 0; i < len(r.Labels); i++ {
    lab := <-chOut
    fmt.Printf("Processed %v
", lab.LabelID)
}

EDIT:

Here a playground sample.