Create a gist now

Instantly share code, notes, and snippets.

@meson10 /syncOnce.go
Last active Jun 29, 2016

What would you like to do?
Sync.Once
package main
import (
"log"
"sync"
)
type MyStruct struct {
field int
}
var onceCached *MyStruct
func initMyStruct() MyStruct {
return MyStruct{field: 1}
}
var once sync.Once
func getIntOnce(ident int) *MyStruct {
log.Println("No lock", ident)
once.Do(func() {
log.Println("Initializing GetInt")
x := initMyStruct()
onceCached = &x
})
log.Println("No lock return", ident)
return onceCached
}
func main() {
var wg sync.WaitGroup
for x := range []int{0, 1, 2, 3, 4, 5} {
wg.Add(1)
go func(ident int) {
defer wg.Done()
log.Println(getIntOnce(ident))
}(x)
}
wg.Wait()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment