频道接收运算符用于不是频道的东西?

时间:2018-02-09 12:01:14

标签: go syntax channel

我想了解这段代码的含义:

<-

在以下代码段中:

package main

import (
    "fmt"
    "net/http"
    "time"
)

func doSomething(s string) {
    fmt.Println("doing something", s)
}

func startPolling() {
    for {

        // Here:
        <-time.After(2 * time.Second)

        go doSomething("from polling")
    }
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello")
}

func main() {
    go startPolling()

    http.HandleFunc("/", handler)
    http.ListenAndServe(":8080", nil)
}

虽然我理解这段代码的作用(它每两秒打印从轮询做一些事情)但我不明白为什么<-在其正常的发送上下文之外被使用/从频道接收。

换句话说,我在这里看不到一个频道。

1 个答案:

答案 0 :(得分:2)

time.After会返回一个频道:

func After(d Duration) <-chan Time

<-time.After(...)只是等待有一个要从通道读取的元素,这在指定的时间过去之后发生。通道值是持续时间之后的时间。

此函数是一个包函数,不应与Time上的方法混淆: func (t Time) After(u Time) bool只返回t是否在u之后。将使用以下方法调用此方法:if sometimevariable.After(...) {