为什么频道不工作?

时间:2014-09-30 06:34:24

标签: go

我正在研究https://talks.golang.org/2012/concurrency.slide#25'

中的“Go Concurrency Pattern”

问题

  1. 频道如何与外界共享变量?在这种情况下, i 已被共享。 A点和B点的变量似乎有一些特殊的关系?它是什么?

  2. 这意味着什么?

    表示i:= 0; ; i ++

  3. 主要代码:

    package main
    
    import (
        "fmt"
        "math/rand"
        "time"
    )
    
    func boring(msg string) <-chan string { // Returns receive-only channel of strings.
    
        c := make(chan string)
        go func() { // We launch the goroutine from inside the function.
            for i := 0; ; i++ {           // <--------- point B
                c <- fmt.Sprintf("%s %d", msg, i)
    
                time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond)
            }
        }()
        return c // Return the channel to the caller.
    }
    
    func main() {
        c := boring("boring!") // Function returning a channel.
        for i := 0; i < 5; i++ {               // <--------- point A
            fmt.Printf("You say: %q\n", <-c)
        }
        fmt.Println("You're boring; I'm leaving.")
    }
    

    输出:

    You say: "boring! 0"
    You say: "boring! 1"
    You say: "boring! 2"
    You say: "boring! 3"
    You say: "boring! 4"
    You're boring; I'm leaving.
    Program exited.
    

1 个答案:

答案 0 :(得分:0)

for (i := 0; ; i++) { }创建一个永久增量的索引。

当您make(chan string )创建了一个读/写频道。您还可以引用go函数内的通道并将其作为返回值传递出去。 Go对变量的使用方式进行了分析,称为&#34;逃逸分析&#34;并且选择是否在堆上或堆栈上创建通道,在堆的情况下,以便当创建通道的函数退出通道时不会被释放。