Что такое эквивалент nodejs setTimeout в Golang?
Я сейчас учусь, и я скучаю setTimeout
с Nodejs в golang. Я еще мало читал, и мне интересно, могу ли я реализовать то же самое в go как интервал или петлю.
есть ли способ, что я могу оставить этот узел в 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")
}
3 ответов
ближайший аналог -time.AfterFunc
функция:
import "time"
...
time.AfterFunc(3*time.Second, somefunction)
это породит новый goroutine и запустить данную функцию после указанного количества времени. В пакете есть другие связанные функции, которые могут быть полезны:
time.After
: эта версия вернет канал, который будет отправлять значение после заданного количества времени. Это может быть полезно в сочетании сselect
заявление, если вы хотите тайм-аут во время ожидания на одном или нескольких каналах.time.Sleep
: эта версия будет просто блокировать до истечения таймера. В Go более распространено писать синхронный код и полагаться на планировщик для переключения на другие goroutines, поэтому иногда просто блокировка является лучшим решением.
есть еще time.Timer
и time.Ticker
типы, которые могут использоваться для менее тривиальных случаев, когда вам может потребоваться отменить таймер.
другим решением может быть реализация
немедленно вызываемая функция Expression (IIFE), например:
go func() {
time.Sleep(time.Second * 3)
// your code here
}()
этой сайт предоставляет интересный пример и объяснение таймаутов с участием каналов и функции select.
// _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's 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's 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 Playground