下面是一个函数,用于启动外部进程,将正则表达式与进程的标准输出进行匹配,并返回匹配的内容。为什么我的函数没有返回?
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
无限期地挂起而不是返回?
只是好奇,为什么'延期'是在goroutine? (我假设你在'starCircuit'函数中打开文件) – AkiRoss
另外,你能提供一个MWE吗?我有点好奇地尝试自己:) – AkiRoss
@ T.Claverie你已经删除了你的答案,但是你建议在goroutine之外移动'make'调用似乎解决了这个问题。随时重新提交您的答案! – blz