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.

Reply via email to