如何正确解组命令行输入?
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) 具体。更好的方法是从标准输入读取或从文件读取。
我在 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) 具体。更好的方法是从标准输入读取或从文件读取。