MST

星途 面试题库

面试题:Go语言中如何使用Goroutine实现简单的延迟执行任务

请描述在Go语言里,使用Goroutine和`time.Sleep`或者`time.After`等相关方法,实现一个延迟5秒执行的简单任务,比如打印一条指定信息。并解释`time.Sleep`和`time.After`在这种场景下的使用区别。
28.0万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

使用Goroutine和time.Sleep实现延迟任务

package main

import (
    "fmt"
    "time"
)

func main() {
    go func() {
        time.Sleep(5 * time.Second)
        fmt.Println("延迟5秒后执行,使用time.Sleep")
    }()
    // 防止主函数退出
    select {}
}

使用Goroutine和time.After实现延迟任务

package main

import (
    "fmt"
    "time"
)

func main() {
    go func() {
        <-time.After(5 * time.Second)
        fmt.Println("延迟5秒后执行,使用time.After")
    }()
    // 防止主函数退出
    select {}
}

time.Sleeptime.After在这种场景下的使用区别

  • time.Sleep:它会阻塞当前的Goroutine,在调用time.Sleep的这段时间内,该Goroutine无法执行其他任务,直到睡眠时间结束。如果在主Goroutine中使用time.Sleep,会导致整个程序暂停运行。在上述示例中,它简单直接地让所在的Goroutine暂停5秒后再执行后续打印任务。
  • time.Aftertime.After返回一个只接收数据的通道,它不会阻塞当前Goroutine。而是在指定的时间后,向这个通道发送一个当前时间。在示例中,通过<-time.After(5 * time.Second)来阻塞Goroutine,直到通道接收到数据(即5秒后),才继续执行后续打印任务。这种方式相对更灵活,尤其在需要结合其他通道操作或者更复杂的并发场景时,它允许Goroutine在等待时间的同时,还可以处理其他通道的操作。