我知道Stop
函数无法关闭通道。我只是对两个不同的结果感到困惑tickerTest1
and tickerTest2
.
package main
import (
"time"
"log"
)
func tickerTest1() {
ticker := *time.NewTicker(time.Second)
count := 0
go func() {
time.Sleep(3*time.Second)
ticker.Stop()
}()
for range ticker.C {
count ++
log.Println("tickerTest1:", count)
}
}
func tickerTest2() {
ticker := time.NewTicker(time.Second)
count := 0
go func() {
time.Sleep(3*time.Second)
ticker.Stop()
}()
for range ticker.C {
count ++
log.Println("tickerTest2:", count)
}
}
func main() {
go tickerTest1()
tickerTest2()
}
tickerTest2()
按预期工作,所以让我们检查一下tickerTest1()
.
time.NewTicker() https://golang.org/pkg/time/#NewTicker返回一个指针值,一个类型的值*time.Ticker https://golang.org/pkg/time/#Ticker。这已经暗示您应该这样使用它:作为指针(并且不应该取消引用它)。
然而,您可以使用间接运算符取消引用它:
ticker := *time.NewTicker(time.Second)
通过取消引用它,ticker
将是类型time.Ticker
,非指针类型。它的值将是copy指针所指向的值NewTicker()
返回。
仅此一点不会成为问题,因为 Go 会自动获取地址ticker
每当您调用带有指针接收器的方法时(例如Ticker.Stop() https://golang.org/pkg/time/#Ticker.Stop)。但是作为接收者传递的地址将是这个地址ticker
变量以及任何修改该变量的方法time.Ticker
struct 只会修改这个不同的副本,而不是time.Ticker
返回值所指向的值NewTicker()
功能。
所以实际上,您只需停止复制Ticker
存储在ticker
变量,而不是原始变量Ticker
返回的NewTicker()
实际上是在通道上发送值。这仍然没有停止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)