` package main
import ( "fmt" )
type A struct { B string }
type B struct { C string A } func main(){ var a B a.C = "a" a.B = "b" fmt.Println(a) }`
上面这段代码返回 {a {b}}
, 如何才能定义一个嵌套的结构体并且返回 {a b}
先谢谢大佬们了
1
catror 2020-03-31 22:27:31 +08:00
要定制化结构体的输出,实现 String 函数即可,可以搜索关键字 Stringer
|
2
xmge 2020-03-31 22:27:58 +08:00
```
package main import ( "fmt" ) type A struct { B string } func (this A)String() string { return "{a b}" } type B struct { C string A } func main(){ var a B a.C = "a" a.B = "b" fmt.Println(a) } ``` |
3
xmge 2020-03-31 22:29:42 +08:00
package main
import ( "fmt" ) type A struct { B string } type B struct { C string A } func (this B)String() string { return fmt.Sprintf("{%s,%s}",this.C,this.A.B) } func main(){ var a B a.C = "a" a.B = "b" fmt.Println(a) } |
4
wudaown OP @catror @xmge
type InternalWorkOrderItem struct { ItemID string `json:"item_id" bson:"item_id"` ItemNum string `json:"item_num" bson:"item_num"` Unit string `json:"unit" bson:"unit"` Qty int `json:"qty" bson:"qty"` UnitPrice float64 `json:"unit_price" bson:"unit_price"` TotalPrice float64 `json:"total_price" bson:"total_price"` CadDir string `json:"cad_dir" bson:"cad_dir"` State string `json:"state" bson:"state" binding:"required"` InternalWorkOrder `json:"internal_work_order" bson:"internal_work_order"` } 其实是这样的,从数据库里面取出来的数据,然后返回到前端是 json,如果要重现 string 函数的话,那就是要在返回前运行一次重写的 string 函数?好像怪怪的 |
6
wudaown OP @xmge
{ "item_id":"A022-59451-1", "item_num":"30928-32938-392", "unit":"pc", "qty":2, "unit_price":20, "total_price":40, "cad_dir":"30928-32938-392", "state":"业务下单", "internal_work_order":{ "id":"", "internal_work_num":"", "customer":"", "customer_po":"", "po_submit_date":"0001-01-01T00:00:00Z", "customer_dateline":"0001-01-01T00:00:00Z", "internal_dateline":"0001-01-01T00:00:00Z", "delivery_dateline":"0001-01-01T00:00:00Z" } } 这是现在返回的 { "item_id":"A022-59451-1", "item_num":"30928-32938-392", "unit":"pc", "qty":2, "unit_price":20, "total_price":40, "cad_dir":"30928-32938-392", "state":"业务下单", "id":"", "internal_work_num":"", "customer":"", "customer_po":"", "po_submit_date":"0001-01-01T00:00:00Z", "customer_dateline":"0001-01-01T00:00:00Z", "internal_dateline":"0001-01-01T00:00:00Z", "delivery_dateline":"0001-01-01T00:00:00Z" } 这是想要返回的,就是把里面嵌套的去掉 |
7
wudaown OP 其实可以在前端处理,就是担心如果数据量很大的话 浏览器会卡住
|
8
guolaopi 2020-03-31 22:49:27 +08:00
你在 type B 定义里 写 A 的时候不要给 A 加 json 的 tag 应该就是你要的效果。。
如果给 A 加了 json="xx"的话,输出 json 是这样的: { "C" : "...", "xx" : { "B" : "...." } } 不加 tag 的话是这样 { "C" : "...", "B" : "..." } |
9
guolaopi 2020-03-31 22:50:35 +08:00
InternalWorkOrder 这个后面的`json:"internal_work_order" bson:"internal_work_order"`去掉,应该可以
|
11
guolaopi 2020-03-31 22:57:09 +08:00
@wudaown
我刚开始学 go 。。 你把他对应理解成如果 struct Father 中套 struct Son, 如果 Son 不写 tag 的话相当于 js 的 "...Son" 展开了 Son 的属性。 如果写了 json 的 tag 的话会被你写的 tag 包裹、嵌套起来。。写法看着不是特别舒服。。 |
12
guolaopi 2020-03-31 22:58:39 +08:00
@wudaown
原理的话我猜想是 go 去查找你写了 tag 的属性,如果有的话,定义一个 json 的 key,然后将它的属性展开成一个 json 对象对应这个 key 。。。不知道对不对 |
14
Trim21 2020-03-31 23:16:16 +08:00 via Android
json 的 tag 有 inline 选项
|