Sobes.tech
Junior — Middle

È consentito passare segmenti di slice a goroutine separate per l'elaborazione parallela?

sobes.tech AI

Risposta dell'AI

Sì, trasferire segmenti di slice (fette) a goroutine separate per l'elaborazione parallela è consentito e spesso utilizzato per parallelizzare i compiti. Tuttavia, è importante ricordare che le slice in Go sono tipi di riferimento, cioè più goroutine possono fare riferimento allo stesso array sottostante. Per evitare condizioni di gara, bisogna garantire che ogni goroutine lavori con un segmento unico della slice e non modifichi i dati usati da altre goroutine, oppure usare la sincronizzazione (ad esempio, mutex) durante l'accesso condiviso.

Esempio di trasferimento sicuro di segmenti di slice a goroutine:

func processSegment(segment []int, wg *sync.WaitGroup) {
    defer wg.Done()
    // Elaborazione del segmento
}

func main() {
    data := []int{1, 2, 3, 4, 5, 6, 7, 8}
    var wg sync.WaitGroup
    segmentSize := 2

    for i := 0; i < len(data); i += segmentSize {
        end := i + segmentSize
        if end > len(data) {
            end = len(data)
        }
        wg.Add(1)
        go processSegment(data[i:end], &wg)
    }
    wg.Wait()
}

In questo esempio, ogni goroutine riceve un segmento separato della slice, il che è sicuro per l'elaborazione parallela.