从golang程序中执行另一个go程序

从golang程序中执行另一个go程序,第1张

概述我想从另一个go程序执行另一个go程序并给它args,如下所示: package mainfunc main() { //here I want to call a specific go file, e.g. test.go with args} test.go package mainfunc main(x int) { //do stuff with x} 我不想发送一个i 我想从另一个go程序中执行另一个go程序并给它args,如下所示:

package mainfunc main() {  //here I want to call a specific go file,e.g. test.go with args}

test.go

package mainfunc main(x int) {  //do stuff with x}

我不想发送一个int作为arg,但像http.ResponseWriter

我想到的解决方案,但它不会很好:

>使用gob将http.ResponseWriter转换为字符串
>从test.go读一行
>将字符串发送到test.go

谢谢你的回答:D

解决方法 有许多方法可以实现这种互 *** 作性:
1-如果你有双方的源文件,我建议使用标准的golang包(lib)调用,而不是互 *** 作性.

2-使用“os / exec”:如果你没有源码,而你只有二进制,
 或者您可以通过文件或文本args传递args:

你可以通过这样的args:

package mainimport (    "fmt"    "os")func main() {    fmt.Println(os.Args[0]) // filenameAndpath}

或使用“flag”std lib:

// flags.exe -hpackage mainimport (    "flag"    "fmt")func main() {    namePtr := flag.String("name","AR","name")    agePtr := flag.Int("age",3700,"age")    flag.Parse()    fmt.Println(*namePtr,*agePtr) //AR 3700}/*Usage of flags.exe:  -age int        age (default 3700)  -name string        name (default "AR")*/

这将提供-h的帮助.
你可以像这样调用另一个二进制程序或golang编译器:

package mainimport (    "log"    "os/exec")func main() {    cmnd := exec.Command("main.exe","arg")    //cmnd.Run() // and wait    cmnd.Start()    log.Println("log")}

3-另一种方法是使用stdin / stdout调用外部程序.
通过这种方式,您可以通过stdin / out发送二进制数据:
这里文件“a”调用二进制文件“b”并通过stdin / stdout发送和接收:
这是我的转换:
http://erlang.org/doc/tutorial/c_port.html
(你可以使用os命名管道)
档案a:

// apackage mainimport (    "fmt"    "log"    "os/exec"    "runtime"    "time")var cout chan []byte = make(chan []byte)var cin chan []byte = make(chan []byte)var exit chan bool = make(chan bool)func Foo(x byte) byte { return call_port([]byte{1,x}) }func bar(y byte) byte { return call_port([]byte{2,y}) }func Exit() byte      { return call_port([]byte{0,0}) }func call_port(s []byte) byte {    cout <- s    s = <-cin    return s[1]}func start() {    fmt.Println("start")    cmd := exec.Command("../b/b")    stdin,err := cmd.StdinPipe()    if err != nil {        log.Fatal(err)    }    stdout,err2 := cmd.StdoutPipe()    if err2 != nil {        log.Fatal(err2)    }    if err := cmd.Start(); err != nil {        log.Fatal(err)    }    defer stdin.Close()    defer stdout.Close()    for {        select {        case s := <-cout:            stdin.Write(s)            buf := make([]byte,2)            runtime.Gosched()            time.Sleep(100 * time.Millisecond)            stdout.Read(buf)            cin <- buf        case b := <-exit:            if b {                fmt.Printf("Exit")                return //os.Exit(0)            }        }    }}func main() {    go start()    runtime.Gosched()    fmt.Println("30+1=",Foo(30)) //30+1= 31    fmt.Println("2*40=",bar(40)) //2*40= 80    Exit()    exit <- true}

文件b:

// bpackage mainimport (    "log"    "os")func foo(x byte) byte { return x + 1 }func bar(y byte) byte { return y * 2 }func ReadByte() byte {    b1 := make([]byte,1)    for {        n,_ := os.Stdin.Read(b1)        if n == 1 {            return b1[0]        }    }}func WriteByte(b byte) {    b1 := []byte{b}    for {        n,_ := os.Stdout.Write(b1)        if n == 1 {            return        }    }}func main() {    var res byte    for {        fn := ReadByte()        log.Println("fn=",fn)        arg := ReadByte()        log.Println("arg=",arg)        if fn == 1 {            res = foo(arg)        } else if fn == 2 {            res = bar(arg)        } else if fn == 0 {            return //exit        } else {            res = fn //echo        }        WriteByte(1)        WriteByte(res)    }}

4 – 另一种方法是使用“net / rpc”,这是从另一个程序调用另一个函数的最佳方法.
样品:

// rpcpackage mainimport (    "fmt"    "net"    "net/rpc"    "runtime"    "sync")var wg sync.WaitGrouptype Server struct{}func (this *Server) Add(u [2]int64,reply *int64) error {    *reply = u[0] + u[1]    return nil}func server() {    fmt.Println("server: Hi")    rpc.Register(new(Server))    ln,err := net.Listen("tcp","127.0.0.1:12345")    if err != nil {        fmt.Println(err)        return    }    for {        c,err := ln.Accept()        if err != nil {            continue        }        go rpc.ServeConn(c)    }}func clIEnt() {    wg.Add(1)    c,err := rpc.Dial("tcp","127.0.0.1:12345")    if err != nil {        fmt.Println(err)        return    }    fmt.Println("Connected...")    var result int64    err = c.Call("Server.Add",[2]int64{10,20},&result)    if err != nil {        fmt.Println(err)    } else {        fmt.Println("Server.Add(10,20) =",result)    }    wg.Done()}func main() {    go server()    runtime.Gosched()    go clIEnt()    runtime.Gosched()    wg.Wait()    fmt.Println("Bye")}/*output:server: HiConnected...Server.Add(10,20) = 30Bye*/
总结

以上是内存溢出为你收集整理的从golang程序中执行另一个go程序全部内容,希望文章能够帮你解决从golang程序中执行另一个go程序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1265612.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存