如何使用exec.Command()返回相同类型的值.Output()

时间:2017-07-14 16:44:56

标签: go

在下一个例子中,我使用 nodejs 来计算1 + 1,我希望结果具有相同类型的值,而不是字符串

示例:

func main() {
    cmd := exec.Command("/usr/bin/nodejs", "-p", "1+1")
    var out bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &out
    cmd.Stderr = &stderr
    err := cmd.Run()
    if err != nil {
        log.Println(err, stderr.String())
        os.Exit(1)
    }

    fmt.Println(out.String())
}

有办法吗?

1 个答案:

答案 0 :(得分:1)

执行命令时,会返回一个字符串。您需要对其进行反序列化以获得正确的类型。如果您只希望Node.js命令打印数字,则可以使用strconv.ParseFloat

func main() {
    cmd := exec.Command("/usr/bin/nodejs", "-p", "1+1")
    b, err := cmd.Output()
    v, err := strconv.ParseFloat(string(b), 64)
    fmt.Println(v) // v is of type float64
}

如果你想处理更复杂的类型,比如javascript对象和数组,我建议使用JSON序列化/反序列化节点的结果:

type Result struct {
    Value float64
    Args []float64
}
func main() {
    var result Result
    cmd := exec.Command("/usr/bin/nodejs", "-p", `JSON.stringify({"value": 1+1, "args": [1, 1]})`)
    b, err := cmd.Output()
    err = json.Unmarshal(b, &r)
    fmt.Println(r.Value)
}