我有一个程序从控制台读取文件名并执行go run filename.go
。
// main.go
package main
import (
"bufio"
"fmt"
"log"
"os"
"os/exec"
)
func main() {
console := bufio.NewReader(os.Stdin)
fmt.Print("Enter a filename: ")
input, err := console.ReadString('\n')
if err != nil {
log.Fatalln(err)
}
input = input[:len(input)-1]
gorun := exec.Command("go", "run", input)
result, err := gorun.Output()
if err != nil {
log.Println(err)
}
fmt.Println("---", input, "Result ---")
fmt.Println(string(result))
}
在同一目录中,我有另一个这样的文件。
// hello.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
当我在控制台中输入“hello.go”时,该文件运行,其输出返回到父Go进程。但是,我有另一个这样的程序。
// count.go
package main
import (
"fmt"
"time"
)
func main() {
i := 0
for {
time.Sleep(time.Second)
i++
fmt.Println(i)
}
}
除了,因为这个程序永远不会返回,我的父进程永远都会挂起。有没有办法与不同的Go流程进行通信?我正在考虑像goroutines的渠道,但对于流程。我需要能够从子进程接收实时标准输出。
我正在尝试解决的问题是从目录动态执行Go程序。 Go文件将每天添加,删除和修改。我想尝试像Go Playgrounds这样的东西。主要流程是一个服务于网页的网络服务器,所以我不能一直关闭它来修改代码。
答案 0 :(得分:1)
不要使用go run
,您需要执行go run
自己正在做的事情,让go程序成为服务器进程的直接子项。
使用go build -o path_to/binary source_file.go
可以为您提供更多控制权。然后,您可以直接执行并与生成的二进制文件进行通信。