- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我最近开始使用 go,我真的很困惑这个程序的执行顺序。我希望我在这里问的不是非常琐碎的问题。
这基本上是 golang 之旅中的 #69,我插入了一些 Println; Playground 链接:http://play.golang.org/p/PXDlD3EA2f
func fibonacci(c, quit chan int) {
x, y := 0, 1
fmt.Println("Inside the fibonacci")
for {
select {
case c <- x:
fmt.Println("Inside the for, first case, before reassigning ", x, y)
x, y = y, x+y
fmt.Println("Inside the for, first case, after reassigning ", x, y)
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
fmt.Println("Begin of Main")
c := make(chan int)
quit := make(chan int)
fmt.Println("Before gonig to the func")
go func() {
fmt.Println("Inside go routine")
fmt.Println("Inside go routine... again")
for i := 0; i < 10; i++ {
fmt.Println("Inside go routine and the for, before printing the channel")
fmt.Println(<-c)
}
quit <- 0
}()
fmt.Println("Before calling to fibonacci")
fibonacci(c, quit)
fmt.Println("Closing")
}
在我获得的非常详细的输出中(见下图),有几件事我不明白:
为什么在 go 例程中“Inside the fibonacci”行在这些行之前?这是因为在 go 命令之后,编译器只是同时读取 func 和 fibonacci 中的内容吗?
fibonacci 和 func 如何相互作用? func 没有改变 channel c,那么为什么斐波那契 react ?谁在改变 c?
为什么斐波那契里面每次都有 5 个打印在一起?老实说,我只期待 2。
函数的输出:
最佳答案
让我们一步一步来:
因为您的 go 例程实际上是在您调用 fibonacci
之后开始的,所以调度程序需要一点时间才能启动,例如,如果您启动一个调用 fmt.Println
的 goroutine > 并且在 main
中不做任何等待,程序将在执行之前退出。
fibonacci
正在将数字插入 channel ,注意这部分:
select {
case c <- x: //this is sending x to the channel
这又取决于调度程序和 fmt.Print*
不锁定标准输出的事实,输出可以以任何顺序发生,因为它是 2 个不同的线程打印内容。
关于concurrency - go例程中的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25417961/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!