Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在尝试向封闭通道插入值时,避免恐慌 主程序包 进口( “fmt” “时间” ) func fib()chan int{ c:=制造(成交量) go func(){ c_Go - Fatal编程技术网

在尝试向封闭通道插入值时,避免恐慌 主程序包 进口( “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))
}