Ваша функция main
раскручивает программу, чтобы запустить Updater
, а затем немедленно завершает работу.Без сна у Updater
нет времени начинать и делать свое дело.Этот код racy - иногда он работает так, как вы ожидаете, а иногда нет.Вы должны каким-то образом синхронизировать Updater
последовательность с main
, используя, например, канал или группу ожидания.
Кроме того, вы обновляете глобал Nonce
в одной процедуре и читаете ее в другой.- это гонка данных.Вам нужно будет синхронизировать доступ к этой переменной с мьютексом.
Вот более правильный вариант вашего кода, хотя он все еще довольно бессмысленный (зачем вам нужна программа для запуска занятыхloop?)
package main
import (
"fmt"
"sync"
)
var Nonce int = 0
func Updater(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 1000; i++ {
Nonce += 1
}
}
func main() {
var wg sync.WaitGroup
wg.Add(1)
go Updater(&wg)
wg.Wait()
fmt.Printf("%d\n", Nonce)
}
Здесь мы используем WaitGroup
для Updater
, чтобы сигнализировать «Я закончил» главной программе, которая только затем проверяет значение Nonce
.Эта программа должна печатать "1000" каждый раз