```go
type User struct {
ID int
Name string
}
var (
dbHits int
)
func getUserInfoFromDB(id int) User {
time.Sleep(100 * time.Millisecond)
dbHits++
return User{ID: id, Name: fmt.Sprintf("User-%d", id)}
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
fmt.Println(getUserInfoFromDB(i))
}(42)
}
wg.Wait()
fmt.Println("DB hits:", dbHits)
}
```
```go
func main() {
var wg sync.WaitGroup
j := 12345
for i := 0; i < 5000; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
once.Do(func() {
user = getUserInfoFromDB(42)
})
fmt.Println(user)
}(j)
}
wg.Wait()
fmt.Println("DB hits:", dbHits)
}
```
(Senza una domanda esplicita, ma il codice suggerisce un compito relativo alla concorrenza, sincronizzazione e minimizzazione delle chiamate al database usando sync.Once o tecniche simili.)