golang struct 问题 - V2EX
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wudaown

golang struct 问题

  •  
  •   wudaown Mar 31, 2020 3116 views
    This topic created in 2236 days ago, the information mentioned may be changed or developed.

    ` package main

    imprt ( "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}

    先谢谢大佬们了

    14 replies    2020-03-31 23:16:16 +08:00
    catror
        1
    catror  
       Mar 31, 2020
    要定制化结构体的输出,实现 String 函数即可,可以搜索关键字 Stringer
    xmge
        2
    xmge  
       Mar 31, 2020
    ```
    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
        3
    xmge  
       Mar 31, 2020
    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
        4
    wudaown  
    OP
       Mar 31, 2020
    @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
        5
    xmge  
       Mar 31, 2020
    @wudaown 建议把你现在返回去的 json 格式和你想要变成的 json 格式发一下,
    wudaown
        6
    wudaown  
    OP
      &nbs;Mar 31, 2020
    @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
        7
    wudaown  
    OP
       Mar 31, 2020
    其实可以在前端处理,就是担心如果数据量很大的话 浏览器会卡住
    guolaopi
        8
    guolaopi  
       Mar 31, 2020
    你在 type B 定义里 写 A 的时候不要给 A 加 json 的 tag 应该就是你要的效果。。
    如果给 A 加了 json="xx"的话,输出 json 是这样的:
    {
    "C" : "...",
    "xx" : {
    "B" : "...."
    }
    }

    不加 tag 的话是这样
    {
    "C" : "...",
    "B" : "..."
    }
    guolaopi
        9
    guolaopi  
       Mar 31, 2020
    InternalWorkOrder 这个后面的`json:"internal_work_order" bson:"internal_work_order"`去掉,应该可以
    wudaown
        10
    wudaown  
    OP
       Mar 31, 2020
    @guolaopi 还真是.. 这什么原理 谢谢
    guolaopi
        11
    guolaopi  
       Mar 31, 2020
    @wudaown
    我刚开始学 go 。。
    你把他对应理解成如果 struct Father 中套 struct Son, 如果 Son 不写 tag 的话相当于 js 的 "...Son" 展开了 Son 的属性。
    如果写了 json 的 tag 的话会被你写的 tag 包裹、嵌套起来。。写法看着不是特别舒服。。
    guolaopi
        12
    guolaopi  
       Mar 31, 2020
    @wudaown
    原理的话我猜想是 go 去查找你写了 tag 的属性,如果有的话,定义一个 json 的 key,然后将它的属性展开成一个 json 对象对应这个 key 。。。不知道对不对
    wudaown
        13
    wudaown  
    OP
       Mar 31, 2020
    @guolaopi 理解了,谢谢 看来还是要去啃源码
    Trim21
        14
    Trim21  
       Mar 31, 2020 via Android
    json 的 tag 有 inline 选项
    About     Help     Advertise     Blog     API     FAQ     Solana     3054 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 99ms UTC 08:52 PVG 16:52 LAX 01:52 JFK 04:52
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86