go concurrent execution of f with parameter i. Tasks are independent and don't return any value.

package main

import (
    "fmt"
    "sync"
)

func main() {
    numTasks := 10
    var wg sync.WaitGroup

    for i := 0; i < numTasks; i++ {
        wg.Add(1)
        go executeTask(&wg, i)
    }

    wg.Wait()
}

func executeTask(wg *sync.WaitGroup, i int) {
    defer wg.Done()
    fmt.Printf("Task %d is executed\n", i)
    // Perform independent task with parameter i
}