V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
wudaown
V2EX  ›  Go 编程语言

golang struct 问题

  •  
  •   wudaown · 2020-03-31 22:18:17 +08:00 · 1951 次点击
    这是一个创建于 920 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    先谢谢大佬们了

    14 条回复    2020-03-31 23:16:16 +08:00
    catror
        1
    catror  
       2020-03-31 22:27:31 +08:00
    要定制化结构体的输出,实现 String 函数即可,可以搜索关键字 Stringer
    xmge
        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)
    }
    ```
    xmge
        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)
    }
    wudaown
        4
    wudaown  
    OP
       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
        5
    xmge  
       2020-03-31 22:39:02 +08:00
    @wudaown 建议把你现在返回去的 json 格式和你想要变成的 json 格式发一下,
    wudaown
        6
    wudaown  
    OP
       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
        7
    wudaown  
    OP
       2020-03-31 22:48:52 +08:00
    其实可以在前端处理,就是担心如果数据量很大的话 浏览器会卡住
    guolaopi
        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" : "..."
    }
    guolaopi
        9
    guolaopi  
       2020-03-31 22:50:35 +08:00
    InternalWorkOrder 这个后面的`json:"internal_work_order" bson:"internal_work_order"`去掉,应该可以
    wudaown
        10
    wudaown  
    OP
       2020-03-31 22:54:48 +08:00
    @guolaopi 还真是.. 这什么原理 谢谢
    guolaopi
        11
    guolaopi  
       2020-03-31 22:57:09 +08:00
    @wudaown
    我刚开始学 go 。。
    你把他对应理解成如果 struct Father 中套 struct Son, 如果 Son 不写 tag 的话相当于 js 的 "...Son" 展开了 Son 的属性。
    如果写了 json 的 tag 的话会被你写的 tag 包裹、嵌套起来。。写法看着不是特别舒服。。
    guolaopi
        12
    guolaopi  
       2020-03-31 22:58:39 +08:00
    @wudaown
    原理的话我猜想是 go 去查找你写了 tag 的属性,如果有的话,定义一个 json 的 key,然后将它的属性展开成一个 json 对象对应这个 key 。。。不知道对不对
    wudaown
        13
    wudaown  
    OP
       2020-03-31 22:59:48 +08:00
    @guolaopi 理解了,谢谢 看来还是要去啃源码
    Trim21
        14
    Trim21  
       2020-03-31 23:16:16 +08:00 via Android
    json 的 tag 有 inline 选项
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1132 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 18:06 · PVG 02:06 · LAX 11:06 · JFK 14:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.