英文:
how I can return value with a same type using exec.Command().Output()
问题
在下一个示例中,我正在使用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())
}
有没有办法做到这一点?
英文:
in the next example, I am using nodejs to calculate 1+1 and I want the result with a same type of value, not string
example:
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())
}
is there way to do that?
答案1
得分: 2
执行命令时,你会得到一个字符串作为返回值。你需要对其进行反序列化以获取正确的类型。如果你只期望你的 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 是 float64 类型
}
如果你想处理更复杂的类型,比如 JavaScript 对象和数组,我建议使用 JSON 进行序列化/反序列化 node 的结果:
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, &result)
fmt.Println(result.Value)
}
英文:
When executing a command, you get a string back. You will need to deserialize it to get the proper type back. If you only expect your Node.js command to print numbers, you can use 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
}
If you want to handle more complex types such as javascript objects and array, I suggest serializing/deserializing node's result using 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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论