如何正确解组命令行输入?

How to unmarshal command line input properly?

我在 trial.go 中编写了以下代码片段:

type Mine struct{
    A string `json:"a"`
}

func main(){
    s := Mine{}
    v := os.Args[1]//`{"a":"1"}`
    fmt.Println(v)
    fmt.Println(reflect.TypeOf(v))
    json.Unmarshal([]byte(v), &s)
    fmt.Println(s)  
}

我是运行这个文件如下:

go run trial.go `{"A":"1"}`

但我在 s 中什么也没有得到。它始终是一个空白结构。

我做错了什么?

首先检查 json.Unmarshal().

返回的错误

接下来,您的 json 标签使用小 "a" 作为 JSON 键,但是 encoding/json 包也会识别大写字母 "A"

最后在命令行中传递此类参数可能是 OS (shell) 特定的。反引号和引号通常有特殊含义,尝试这样传递:

go run trial.go {\"a\":\"1\"}

另外你应该在索引它之前检查 os.Args 的长度,如果用户没有提供任何参数,os.Args[1] 会 panic。

正如你提到的,你应该找到另一种方法来测试输入 JSON 文档,如果 JSON 文本较大,这将变得不可行,而且这是 OS (shell) 具体。更好的方法是从标准输入读取或从文件读取。