Sobes.tech
Junior — Middle

Je povoleno předávat segmenty slice do samostatných gorutin pro paralelní zpracování?

sobes.tech AI

Odpověď od AI

Ano, předání segmentů slice (řezů) do samostatných gorutin pro paralelní zpracování je povoleno a často se používá k paralelizaci úkolů. Je však důležité pamatovat, že slices v Go jsou referenční typy, což znamená, že několik gorutin může odkazovat na stejný podkladový pole. Aby se předešlo závodním podmínkám, je třeba zajistit, že každá gorutina pracuje s unikátním segmentem slice a nemění data používaná jinými gorutinami, nebo použít synchronizaci (například mutex) při sdíleném přístupu.

Příklad bezpečného předání segmentů slice do gorutin:

func processSegment(segment []int, wg *sync.WaitGroup) {
    defer wg.Done()
    // Zpracování segmentu
}

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()
}

V tomto příkladu každá gorutina obdrží samostatný segment slice, což je bezpečné pro paralelní zpracování.