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

标签 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())
}

有什么办法吗?

最佳答案

当执行一个命令时,你会得到一个字符串。您将需要反序列化它以获得正确的类型。如果您只希望 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)
}

关于go - 我如何使用 exec.Command().Output() 返回相同类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45107967/

相关文章:

go - 如何导入本地包?

go - 我怎样才能 "go run"在主包中有多个文件的项目?

javascript - Go channel 与 JavaScript 生成器有何不同?

go - 如何创建自定义哈希码以确定数据是否已发生变化

javascript - golang 中的 pubsub 替代方案

go - (Golang)整洁架构 - 谁应该做编排?

interface - Golang接口(interface)不需要导入?

windows - 检查应用程序是否在 golang 中以管理员身份运行

tcp - Go中读取完整网络PDU的方法

go - 如何在 Golang 中查找来自控制台的标志数