Go,将数据传递给通道
Go, passing data to channel
我有一个问题。这是示例:https://play.golang.org/p/QSWY2INQuSE
func Avg(c chan string, wg *sync.WaitGroup) {
defer wg.Done()
c <- "test"
}
func main() {
var wg sync.WaitGroup
c := make(chan string)
timer1 := time.NewTicker(5 * time.Second)
for {
select {
case <-timer1.C:
wg.Add(1)
go Avg(c, &wg)
wg.Wait()
}
}
fmt.Println(<-c)
}
为什么数据达不到fmt.Println(<-c)
谢谢!
因为你有一个无穷无尽的for
,所以最后一个fmt.Println()
语句永远不会到达。
如果您希望最后一个 fmt.Println()
语句一直执行,则必须跳出循环,例如:
loop:
for {
select {
case <-timer1.C:
wg.Add(1)
go Avg(c, &wg)
wg.Wait()
break loop
}
}
fmt.Println(<-c)
请注意,您必须使用标签,否则 break
只会跳出 select
语句(而不是跳出 for
循环)。
另请注意,仅此一项是行不通的,因为通道是无缓冲的,因此 Avg()
将永远被阻止,试图在 c
上发送一个值,而没有人尝试发送从中接收。
如果您创建了要缓冲的通道,这个简单的例子就可以工作了:
c := make(chan string, 1) // Buffer for 1 value
现在它可以工作并打印(在 Go Playground 上试试):
test
我有一个问题。这是示例:https://play.golang.org/p/QSWY2INQuSE
func Avg(c chan string, wg *sync.WaitGroup) {
defer wg.Done()
c <- "test"
}
func main() {
var wg sync.WaitGroup
c := make(chan string)
timer1 := time.NewTicker(5 * time.Second)
for {
select {
case <-timer1.C:
wg.Add(1)
go Avg(c, &wg)
wg.Wait()
}
}
fmt.Println(<-c)
}
为什么数据达不到fmt.Println(<-c)
谢谢!
因为你有一个无穷无尽的for
,所以最后一个fmt.Println()
语句永远不会到达。
如果您希望最后一个 fmt.Println()
语句一直执行,则必须跳出循环,例如:
loop:
for {
select {
case <-timer1.C:
wg.Add(1)
go Avg(c, &wg)
wg.Wait()
break loop
}
}
fmt.Println(<-c)
请注意,您必须使用标签,否则 break
只会跳出 select
语句(而不是跳出 for
循环)。
另请注意,仅此一项是行不通的,因为通道是无缓冲的,因此 Avg()
将永远被阻止,试图在 c
上发送一个值,而没有人尝试发送从中接收。
如果您创建了要缓冲的通道,这个简单的例子就可以工作了:
c := make(chan string, 1) // Buffer for 1 value
现在它可以工作并打印(在 Go Playground 上试试):
test