我正在研究https://talks.golang.org/2012/concurrency.slide#25'
中的“Go Concurrency Pattern”问题:
频道如何与外界共享变量?在这种情况下, i 已被共享。 A点和B点的变量似乎有一些特殊的关系?它是什么?
这意味着什么?
表示i:= 0; ; i ++
主要代码:
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.
答案 0 :(得分:0)
for (i := 0; ; i++) { }
创建一个永久增量的索引。
当您make(chan string )
创建了一个读/写频道。您还可以引用go函数内的通道并将其作为返回值传递出去。 Go对变量的使用方式进行了分析,称为&#34;逃逸分析&#34;并且选择是否在堆上或堆栈上创建通道,在堆的情况下,以便当创建通道的函数退出通道时不会被释放。