以下は、外部プロセスを開始し、正規表現をプロセスの標準出力と照合し、一致の内容を戻す関数です。なぜ私の関数が返っていないのですか?
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
は無期限にハング代わりに戻っていますか?
ちょうど興味がありますが、なぜ「延期」がゴルーチンにあるのですか? (私はあなたが 'starCircuit'関数でファイルを開いていると仮定しています) – AkiRoss
また、MWEを提供できますか?私はちょっと自分自身を試して好奇心が強いです:) – AkiRoss
@ T.Claverieあなたはあなたの答えを削除しましたが、goroutineの外で 'make'呼び出しを移動する提案は問題を修正したようです。あなたの答えを再送信してください! – blz