为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中的动态 JSON 结构未按预期运行

Golang 中的动态 JSON 结构未按预期运行

Go
拉莫斯之舞 2023-03-21 17:16:09
我正在尝试创建一个结构,其中包含一些始终存在的基本字段和一些本身就是结构的可选字段。我想知道为什么下面的代码:package mainimport (    "encoding/json"    "fmt"    "time")type DataManagement struct {    DataManagement struct {        Type              string        Asset struct {            LocalAssetUID string            Type          string        }        *ContentProductionOrder        *ContentItem        TimeStamp         time.Time        Hash              string    }}type ContentProductionOrder struct {    ProductionOrderNo int    ItemNo            int    StartDate         time.Time    FinishDate        time.Time    StatusID          int    StatusDate        time.Time    SourceTypeID      int    TrackingID        int}type ContentItem struct {    ItemNo     int    ItemText   string    Quantity   int}func main() {    var contentItem ContentItem    contentItem.ItemNo = 123    contentItem.ItemText = "aaaaaaaa"    contentItem.Quantity = 3    var dataManagement DataManagement    dataManagement.DataManagement.Type = "asd"    dataManagement.DataManagement.Asset.LocalAssetUID = "asd"    dataManagement.DataManagement.Asset.Type = "asd"    dataManagement.DataManagement.ContentItem = &contentItem    dataManagement.DataManagement.TimeStamp = time.Now().UTC()    dataManagement.DataManagement.Hash = "123"    xy, _ := json.MarshalIndent(dataManagement, "", "  ")    fmt.Println(string(xy))    xy, _ = json.MarshalIndent(contentItem, "", "  ")    fmt.Println(string(xy))}输出如下:{  "DataManagement": {    "Type": "asd",    "Asset": {      "LocalAssetUID": "asd",      "Type": "asd"    },    "ItemText": "aaaaaaaa",    "Quantity": 3,    "TimeStamp": "2009-11-10T23:00:00Z",    "Hash": "123"  }}{  "ItemNo": 123,  "ItemText": "aaaaaaaa",  "Quantity": 3}有任何想法吗?这可能很容易解释;我在 Golang 方面没有那么丰富的经验。
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

你没有得到你想要的输出是因为你使用了嵌入式结构而ContentItem不是DataManagement字段名称来添加到结构中。

使用类型声明但没有显式字段名称的字段称为嵌入字段。嵌入字段必须指定为类型名称 T 或指向非接口类型名称 *T 的指针,并且 T 本身可能不是指针类型。非限定类型名称充当字段名称。

现场声明将解决您的问题。您应该将结构更改DataManagement为:

type DataManagement struct {
    DataManagement struct {
        Type  string
        Asset struct {
            LocalAssetUID string
            Type          string
        }
        *ContentProductionOrder // this is embedded struct
        ContentItem *ContentItem
        TimeStamp time.Time
        Hash      string
    }
}

Go Playground上的工作代码

有关更多信息,请查看结构类型的 Golang 规范


查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 78 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信