once.Do() не отрабатывает

Изучаю Golang и столкнулся с тем что пример из официальной документации не отрабатывает как ожидается ссылка на пример

Код который я запускаю:

package main

import (
    "sync"
)

var a string
var once sync.Once

func setup() {
    a = "hello, world"
}

func doprint() {
    once.Do(setup)
    print(a)
}

func twoprint() {
    go doprint()
    go doprint()

}

func main() {
    twoprint()
}

hello world не печатается, хотя дока говорит что должно печататься дважды

Версия Go 1.16.5


Ответы (1 шт):

Автор решения: Senior Pomidor

twoprint запускакет в отдельной горутине печатание, передает управление в main. main-у остается только завершить программу, потому что нечего ему еще делать.

тут нужно дожидаться завершения всех горутин. смотрите на WaitGroup. Либо сделать костыль и ждать секунду, пока горутины не отработают. https://play.golang.org/p/BCW655UjeUV

package main

import (
    "sync"
    "time"
)

var a string
var once sync.Once

func setup() {
    a = "hello, world"
}

func doprint() {
    once.Do(setup)
    println(a)
}

func twoprint() {
    go doprint()
    go doprint()

}

func main() {
    twoprint()
    time.Sleep(time.Second)
}

→ Ссылка