在尝试向封闭通道插入值时,避免恐慌 主程序包 进口( “fmt” “时间” ) func fib()chan int{ c:=制造(成交量) go func(){ c
在尝试向封闭通道插入值时,避免恐慌 主程序包 进口( “fmt” “时间” ) func fib()chan int{ c:=制造(成交量) go func(){ c,go,Go,Close是goroutine发送到某个频道的一种好方法,它可以向接收方发出信号,表明您已使用该频道。另一种方法是(您的问题)IMHO是可撤销的,至少是直接的。您可以添加另一个通道,向您的fibonacci生成goroutine发送任务结束信号。以下是示例的修改版本,它以允许的(但不一定合理)方式使用通道: 主程序包 进口( “fmt” “时间” ) func fib(c chan int){ C package main import ( "fmt" "time" ) fu
Close
是goroutine发送到某个频道的一种好方法,它可以向接收方发出信号,表明您已使用该频道。另一种方法是(您的问题)IMHO是可撤销的,至少是直接的。您可以添加另一个通道,向您的fibonacci生成goroutine发送任务结束信号。以下是示例的修改版本,它以允许的(但不一定合理)方式使用通道:
主程序包
进口(
“fmt”
“时间”
)
func fib(c chan int){
C
package main
import (
"fmt"
"time"
)
func fib() chan int {
c := make(chan int)
go func() {
c <- 0
c <- 1
n, m := 0, 1
for {
temp := n + m
n = m
m = temp
c <- m // This results in panic, when the channel is closed
}
}()
return c
}
func main() {
start := time.Now()
var lastFib int
c := fib()
for i := 0; i != 1000000; i++ {
lastFib = <-c
}
close(c)
fmt.Println(lastFib)
fmt.Println(time.Now().Sub(start))
}
package main
import (
"fmt"
"time"
)
func fib(c chan int) {
c <- 0
c <- 1
n, m := 0, 1
for {
temp := n + m
n = m
m = temp
c <- m
if m > 100000000 {
close(c)
break
}
}
}
func main() {
start := time.Now()
lastFib, newFib := 0, 0
ok := true
c := make(chan int)
go fib(c)
for {
newFib, ok = <-c
if !ok {
fmt.Println(lastFib)
break
}
lastFib = newFib
}
fmt.Println(time.Now().Sub(start))
}