go语言得到子程序的返回值

作者: CodingCode | 来源:发表于2017-12-09 13:14 被阅读13次

go语言调用外部程序,并获取外部程序的返回值。

例子1: 程序返回0

$ cat main.go
package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("test.sh")
    err := cmd.Run()
    if err != nil {
        fmt.Printf("Return error: %s\n", err)
    } else {
        fmt.Printf("Return OK\n")
    }
}

$ cat test.sh
#!/bin/bash

echo "Hello"
exit 0

运行结果

$ go build && ./main
Return OK

例子2:程序返回非零

$ cat test.sh
#!/bin/bash

echo "Hello"
exit 2

运行结果

$ go build && ./main
Return error: exit status 2

这里我们看到com.Run()的返回成功还是失败的区分是子程序返回值是否为零,其实在这个例子中子程序test.sh执行是正确的,返回2是希望的行为,但是com.Run()把它定义为错误,go就这么设计的,那就没有办法了,需要注意一下就行了。

例子3:区分正常的程序返回值,还是异常错误

例如子程序test.sh不存在,或者test.sh不可执行:

$ ./main
Return error: exec: "test.sh": executable file not found in $PATH

或者test.sh 收到异常信号crash了。

$ ./main
Return error: signal: killed

改造后的main.go


package main

import (
    "fmt"
    "syscall"
    "os/exec"
)

func main() {
    cmd := exec.Command("test.sh")
    err := cmd.Run();

    if err != nil {
        if exitErr, ok := err.(*exec.ExitError); ok {
            status := exitErr.Sys().(syscall.WaitStatus)
            switch {
                case status.Exited():
                    fmt.Printf("Return exit error: exit code=%d\n", status.ExitStatus())
                case status.Signaled():
                    fmt.Printf("Return exit error: signal code=%d\n", status.Signal())
            }
        } else {
            fmt.Printf("Return other error: %s\n", err)
        }
    } else {
        fmt.Printf("Return OK\n")
    }
}

场景1: 正常退出0

$ cat test.sh
#!/bin/bash

echo "Hello"
exit 0
$ ./main
Return OK

子程序正常运行结束,并返回0值。

场景2: 正常退出100

$ cat test.sh
#!/bin/bash

echo "Hello"
exit 100
$ ./main
Return exit error: exit code=100

子程序正常运行结束,并返回100值。

场景3:test.sh不存在或者不可执行

$ chmod -x test.sh
$ ./main
Return other error: exec: "test.sh": executable file not found in $PATH

子程序无法运行,我们得到的是其他类型的错误,而不是exec.ExitError类型错误。

场景4: test.sh 运行中被kill -9

$ cat test.sh
#!/bin/bash

echo "Hello"

sleep 100

exit 100
$ ./main
Return exit error: signal code=9

返回exec.ExitError类型错误,我们拿到signal值为9

注意在另一个Terminal中kill掉test.sh
$ kill -9 PID_OF_test.sh

相关文章

  • go语言得到子程序的返回值

    go语言调用外部程序,并获取外部程序的返回值。 例子1: 程序返回0 运行结果 例子2:程序返回非零 运行结果 这...

  • go 语言基础--函数

    1、函数 和C语言类型,Go语言也有函数的概念,语法如下: 2 参数和返回值 2.1 返回值 go 语言可以返回零...

  • 09-Go语言函数

    函数 Go语言函数格式func 函数名称(形参列表)(返回值列表){函数语句} Go语言函数的类型没有返回值没有形...

  • Go语言函数

    GO语言函数 GO语言是由函数组成的 没有返回值没有形参的函数 有返回值没有形参的函数 没有返回值有形参的函数 有...

  • Perl 定义和调用子程序

    1. 定义和调用子程序 定义子程序格式:sub 程序名 {}。 调用子程序:& 程序名。 子程序返回值:子程序都有...

  • 高质量的子程序(五)

    《代码大全2》阅读随笔 使用函数还是过程 函数是指有返回值的子程序,过程是指没有返回值的子程序。我们的指导建议是如...

  • 06-GoLang函数

    函数格式 C语言中 Go语言中 C语言函数的类型 1.没有返回值没有形参的函数 .2.有返回值没有形参的函数 3....

  • golang使用技巧

    golang map赋值是引用拷贝 返回值 可以放入一行中 go tools 里面支持vscode跳转 go语言c...

  • go 语言函数

    go 语言函数 函数定义格式: 不同形式的函数定义: 无返回值 有一个返回值 有多个返回值 参数传递, 传递一个函...

  • Go语言之旅:函数

    与其他语言类似,Go语言函数也是由函数名、参数、返回值以及函数体等部分组成。语法结构如下: 其中,参数与返回值一起...

网友评论

    本文标题:go语言得到子程序的返回值

    本文链接:https://www.haomeiwen.com/subject/ikvuixtx.html