This trick is used in the standard library (see net.http.envOnce.reset), and for testing purposes it's just about OK (though still dubious IMHO) but you should never use it in production code, as you're writing atomic state with non-atomic operations.
On 20 November 2017 at 00:24, Carl Mastrangelo <carl.mastrang...@gmail.com> wrote: > Hi gophers, > > I was playing around with a puzzle trying to break the sync package and > found something cool. Can you think of a definition for f that causes > once.Do to execute the argument more than once? > > > package main > > import ( > "sync" > ) > > func main() { > var once sync.Once > var f = // ... > > once.Do(f) > } > > > HIGHLIGHT BELOW FOR ANSWER > > > package main > > import ( > "fmt" > "sync" > ) > > func main() { > var once sync.Once > var f func() > times := 9 > f = func() { > if times == 0 { > return > } > times-- > fmt.Println("Called") > oldonce := once > *&once = sync.Once{} > once.Do(f) > once = oldonce > > } > once.Do(f) > } > > HIGHLIGHT ABOVE FOR ANSWER > > -- > You received this message because you are subscribed to the Google Groups > "golang-nuts" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to golang-nuts+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.