Golang中的"<-"是什么意思?

6

我在一小段代码中使用它,让time.After()起作用。如果没有它,程序将直接执行下一行而不会等待计时器完成。

以下是示例:

package main

import (
    "fmt"
    "time"
)

func main() {
    a := 1
    fmt.Println("Starting")
    <-time.After(time.Second * 2)
    fmt.Println("Printed after 2 seconds")
}

11
这是通道接收/发送运算符。请参加Go之旅学习语言基础知识,特别是关于通道的部分。 - Marc
1
在通道表达式左侧出现的 <- 符号表示该通道上的接收操作。time.After 是一个返回(只能接收)通道的函数。 - jub0bs
1个回答

15
<- 运算符用于等待通道的响应。在此代码中,它用于等待由 time.After 提供并在 X 时间后被触发的通道。

您可以在 @Marc 提到的Go 之旅中了解更多有关通道的信息。请注意,如果您不需要处理多个通道结果(如使用 select),则可以将 <-time.After(time.Second * 2) 替换为同步的 time.Sleep(time.Second * 2) 语句。

time.After 通常用于计时异步操作的结果,涉及一个或多个通道,例如:

func doLongCalculations() (int, error) {
    resultchan := make(chan int)
    defer close(resultchan)

    go calculateSomething(resultchan)

    select {
    case <-time.After(time.Second * 2):
        return nil, fmt.Errorf("operation timed out")
    case result := <-resultchan
        return result, nil
    }
}

我们再次强烈建议您参加Go之旅,以了解Go的基础知识 :)


2
谢谢你的回答,Gustavo!我已经更改了我的代码,使用 time.Sleep() 更符合我的使用情况,这样就不需要使用额外的通道。 - Evaldo Junior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接