golang struct 问题

2020-03-31 22:18:17 +08:00
 wudaown

` 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}

先谢谢大佬们了

2416 次点击
所在节点    Go 编程语言
14 条回复
catror
2020-03-31 22:27:31 +08:00
要定制化结构体的输出,实现 String 函数即可,可以搜索关键字 Stringer
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)
}
```
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)
}
wudaown
2020-03-31 22:33:57 +08:00
@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 函数?好像怪怪的
xmge
2020-03-31 22:39:02 +08:00
@wudaown 建议把你现在返回去的 json 格式和你想要变成的 json 格式发一下,
wudaown
2020-03-31 22:46:47 +08:00
@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"
}

这是想要返回的,就是把里面嵌套的去掉
wudaown
2020-03-31 22:48:52 +08:00
其实可以在前端处理,就是担心如果数据量很大的话 浏览器会卡住
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" : "..."
}
guolaopi
2020-03-31 22:50:35 +08:00
InternalWorkOrder 这个后面的`json:"internal_work_order" bson:"internal_work_order"`去掉,应该可以
wudaown
2020-03-31 22:54:48 +08:00
@guolaopi 还真是.. 这什么原理 谢谢
guolaopi
2020-03-31 22:57:09 +08:00
@wudaown
我刚开始学 go 。。
你把他对应理解成如果 struct Father 中套 struct Son, 如果 Son 不写 tag 的话相当于 js 的 "...Son" 展开了 Son 的属性。
如果写了 json 的 tag 的话会被你写的 tag 包裹、嵌套起来。。写法看着不是特别舒服。。
guolaopi
2020-03-31 22:58:39 +08:00
@wudaown
原理的话我猜想是 go 去查找你写了 tag 的属性,如果有的话,定义一个 json 的 key,然后将它的属性展开成一个 json 对象对应这个 key 。。。不知道对不对
wudaown
2020-03-31 22:59:48 +08:00
@guolaopi 理解了,谢谢 看来还是要去啃源码
Trim21
2020-03-31 23:16:16 +08:00
json 的 tag 有 inline 选项

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/658117

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX