gpt4 book ai didi

go - 为什么我的函数没有返回?

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

下面是一个启动外部进程的函数,将正则表达式与进程的标准输出进行匹配,并返回匹配的内容。

func (c *Colony) startCircuit(peer *string) (string, error) {
var (
err error
cmd *exec.Cmd
anchorChan chan string
)

// ... (omitted for readability)

// get the anchor from standard output
go func() {
defer out.Close()

anchorChan = make(chan string)
for scanner := bufio.NewScanner(out); scanner.Scan(); {
line := scanner.Text()
if anchor := reRootAnchor.FindString(line); anchor != "" {
log.Println("Started circuit server with anchor:", anchor)
anchorChan <- anchor
break
}
}
}()

anchor := <-anchorChan
return anchor, err
}

运行该函数时,我获得以下输出,这表明确实找到了一个匹配项并且(大概)将其推送到 anchorChan 中:

2016/05/22 14:04:36 Started circuit server with anchor: circuit://[::]:36195/20666/Q431cc5fe613aa04b

但是,startCircuit 的调用程序似乎挂起。这是相关的代码:

rootAnchor, err := c.startCircuit(peer)
if err != nil {
return "", err
}
log.Fatal(rootAnchor) // DEBUG

为什么 startCircuit 会无限期挂起而不是返回?

最佳答案

其实问题很简单。提示:以下代码以死锁结束。

package main

import "fmt"

func main() {
var c chan string

go func() {
c = make(chan string)
c <- "42"
}()

str := <-c
fmt.Println(str)
}

从那里开始,问题就微不足道了。当您启动 goroutine 时,您的 channel 没有初始化。这两个 goroutine 有一场比赛,显然 go 无法决定哪个应该有优先权。

因此,您的答案是:在 goroutine 启动之前调用 make(chan ...),它应该可以解决您的问题。 effective go. 中有一个完美的例子

关于go - 为什么我的函数没有返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37374205/

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