Каков эквивалент nodejs setTimeout в Голанге?

В настоящее время я изучаю, и я пропускаю setTimeout от Nodejs в golang. Я еще не читал много, и мне интересно, могу ли я реализовать то же самое, что бы идти как интервал или петля.

Есть ли способ, которым я могу написать это от узла до golang? Я слышал, что golang обрабатывает параллелизм очень хорошо, и это могут быть некоторые goroutines или еще?

//Nodejs
function main() {

 //Do something

 setTimeout(main, 3000)
 console.log('Server is listening to 1337')
}

Заранее спасибо!

//Go version

func main() {
  for t := range time.Tick(3*time.Second) {
    fmt.Printf("working %s \n", t)
  }

  //basically this will not execute..
  fmt.Printf("will be called 1st")
}

Ответ 1

Ближайшим эквивалентом является время. Функция time.AfterFunc:

import "time"

...
time.AfterFunc(3*time.Second, somefunction)

Это вызовет появление нового goroutine и запуск данной функции через указанное количество времени. В пакете могут быть использованы другие связанные функции:

  • time.After: эта версия вернет канал, который отправит значение после заданного количества времени. Это может быть полезно в сочетании с оператором select если вы хотите перерыв во время ожидания по одному или нескольким каналам.

  • time.Sleep: эта версия будет просто блокироваться до истечения таймера. В Go чаще встречается синхронный код и полагается на планировщик для переключения на другие goroutines, поэтому иногда простое блокирование - лучшее решение.

Также есть время. time.Timer и время. time.Ticker типы, которые можно использовать для менее простых случаев, когда вам может потребоваться отменить таймер.

Ответ 2

другим решением может быть

Выражение функции мгновенного вызывания (IIFE), например:

go func() {
  time.Sleep(time.Second * 3)
  // your code here
}()

Ответ 3

Этот веб-сайт представляет собой интересный пример и объяснение тайм-аутов с участием каналов и функции выбора.

// _Timeouts_ are important for programs that connect to
// external resources or that otherwise need to bound
// execution time. Implementing timeouts in Go is easy and
// elegant thanks to channels and 'select'.

package main

import "time"
import "fmt"

func main() {

    // For our example, suppose we're executing an external
    // call that returns its result on a channel 'c1'
    // after 2s.
    c1 := make(chan string, 1)
    go func() {
        time.Sleep(2 * time.Second)
        c1 <- "result 1"
    }()

    // Here the 'select' implementing a timeout.
    // 'res := <-c1' awaits the result and '<-Time.After'
    // awaits a value to be sent after the timeout of
    // 1s. Since 'select' proceeds with the first
    // receive that ready, we'll take the timeout case
    // if the operation takes more than the allowed 1s.
    select {
    case res := <-c1:
        fmt.Println(res)
    case <-time.After(1 * time.Second):
        fmt.Println("timeout 1")
    }

    // If we allow a longer timeout of 3s, then the receive
    // from 'c2' will succeed and we'll print the result.
    c2 := make(chan string, 1)
    go func() {
        time.Sleep(2 * time.Second)
        c2 <- "result 2"
    }()
    select {
    case res := <-c2:
        fmt.Println(res)
    case <-time.After(3 * time.Second):
        fmt.Println("timeout 2")
    }
}

Вы также можете запустить его на игровой площадке Go