Golang是否支持嵌套匿名结构体?JSON RPC实践遇错咨询
Go中嵌套匿名结构体的初始化问题
你尝试用嵌套匿名结构体替代顶层定义的jsonRpcRequest和params类型是完全可行的,编译错误是因为初始化内部匿名结构体时没有明确指定类型。
原代码的问题点
在初始化Params字段时,你直接写了{ ... },但Go编译器无法推断这个复合字面量的具体类型(即使外层已经定义了匿名结构体类型),所以会报错missing type in composite literal。
修正方案1:初始化时显式指定内部结构体类型
在Params的赋值处,重复写出内部匿名结构体的定义(和外层声明的结构一致):
package main func main() { data := struct { JsonRpc string `json:"jsonrpc"` Method string `json:"method"` Id string `json:"id"` Params struct { Format string `json:"format"` Cmds []string `json:"cmds"` Version int `json:"version"` } `json:"params"` }{ JsonRpc: "2.0", Method: "someMethod", Id: "someId", Params: struct { Format string `json:"format"` Cmds []string `json:"cmds"` Version int `json:"version"` }{ Format: "json", Cmds: []string{"some", "list", "of", "commands"}, Version: 1, }, } }
修正方案2:先定义内部匿名结构体变量
如果觉得重复写类型麻烦,可以先把内部结构体的实例单独定义,再赋值给Params字段:
package main func main() { params := struct { Format string `json:"format"` Cmds []string `json:"cmds"` Version int `json:"version"` }{ Format: "json", Cmds: []string{"some", "list", "of", "commands"}, Version: 1, } data := struct { JsonRpc string `json:"jsonrpc"` Method string `json:"method"` Id string `json:"id"` Params struct { Format string `json:"format"` Cmds []string `json:"cmds"` Version int `json:"version"` } `json:"params"` }{ JsonRpc: "2.0", Method: "someMethod", Id: "someId", Params: params, } }
补充说明
这两种写法都能满足你的需求——无需定义顶层类型,直接使用嵌套匿名结构体完成JSON RPC请求的结构构建,编译后可以正常序列化为符合要求的JSON格式。
内容的提问来源于stack exchange,提问作者wowzer
相关产品推荐
相关产品推荐

