gpt4 book ai didi

go - 为什么我需要用新的子例程运行 Walk?

转载 作者:IT王子 更新时间:2023-10-29 01:55:37 26 4
gpt4 key购买 nike

我正在写 Walk function in the go tutorial基本上按顺序遍历树。我的作品:

package main

import (
"fmt"
"code.google.com/p/go-tour/tree"
)

// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk__helper(t *tree.Tree, ch chan int) {
if (t == nil) {
return
}

Walk__helper(t.Left, ch)
ch <- t.Value
Walk__helper(t.Right, ch)
}

func Walk(t *tree.Tree, ch chan int) {
Walk__helper(t, ch)
close(ch)
}

func main() {
ch := make(chan int)
go Walk(tree.New(1), ch)
for v := range ch {
fmt.Println(v)
}
}

为什么我必须使用 go Walk(tree.New(1), ch) 而不仅仅是 Walk(tree.New(1), ch)

我的印象是 go 关键字基本上会生成一个新线程。在那种情况下,我们会遇到问题,因为 for 循环可能会在子例程完成之前运行。

奇怪的是,当我取出 go 关键字时,我遇到了死锁。这对我来说是违反直觉的。 go 关键字在这里究竟做了什么?

最佳答案

这里的关键点是 range 与 channel 结合时。

当您在 channel 上range(在本例中为ch)时,它会等待项目在 channel 上发送,然后再遍历循环。这是一个安全的“阻塞”操作,在等待 channel 接收项目时不会死锁。

死锁在不使用 goroutine 时发生,因为您的 channel 没有缓冲。如果您不使用 goroutine,那么方法调用是同步的,Walk 会在 channel 上放一些东西……它会阻塞,直到它被弹出。它永远不会弹出...因为方法调用是同步的。

I was under the impression that the go keyword basically spawns a new thread

..这是不正确的。要了解那里发生的事情,还需要许多更重要的实现细节。您应该将 goroutine 的思维过程与线程分开。将 goroutine 视为并发执行的一段代码,没有“线程”。

关于go - 为什么我需要用新的子例程运行 Walk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25923961/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com