MST

星途 面试题库

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

请编写一段Go代码,使用协程实现一个任务在5秒后执行,并打印出相关信息。要求说明`time.Sleep`和`time.After`在这种场景下的使用方式及区别。
15.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "time"
)

func main() {
    go func() {
        time.Sleep(5 * time.Second)
        fmt.Println("任务在5秒后执行,使用time.Sleep")
    }()

    <-time.After(5 * time.Second)
    fmt.Println("任务在5秒后执行,使用time.After")
}

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

  1. time.Sleep
    • 使用方式:在协程中调用time.Sleep(duration),它会阻塞当前协程指定的时间。在上述代码中,time.Sleep(5 * time.Second)会使启动的匿名协程阻塞5秒,5秒后继续执行协程内后续的代码,即打印信息。
    • 缺点:它会阻塞当前协程,若在主协程中使用time.Sleep,会导致整个程序阻塞,直到睡眠结束。如果有其他需要并行执行的任务,可能会影响程序的响应性。
  2. time.After
    • 使用方式time.After(duration)返回一个只写的<-chan time.Time通道,在指定的时间后,该通道会接收到当前时间。通过<-time.After(5 * time.Second),主协程会阻塞在这个通道操作上,直到5秒后通道接收到数据,然后继续执行后续代码。
    • 优点:相比time.Sleep,它更适合用于在不阻塞整个程序的情况下等待一段时间。在主协程中使用time.After不会影响其他协程的并发执行,能更好地实现异步等待的场景。