简体   繁体   English

用于嵌套对象的 Golang 结构

[英]Golang Struct for Nested Objects

I am currently creating a golang api using GoFiber V2.我目前正在使用 GoFiber V2 创建一个 golang api。

I have the following document structure for a music track in a Mongo database:我在 Mongo 数据库中有以下音乐曲目的文档结构:

{
    "_id" : ObjectId("63cc26cb86ae1611380e1206"),
    "active" : 1,
    "exclusive" : "false",
    "track_title" : "Burn Slow (sting)",
    "artist_id" : "395",
    "artist_name" : "David Hollandsworth",
    "album_title" : "Cult Justice 23",
    "composer" : "David Hollandsworth",
    "duration" : "00:16",
    "publisher" : "FlikTrax, LLC",
    "description" : "T.V. drama, rural tension, apprehension. Style: \"Hell on Wheels\" soundtrack.",
    "url_path" : "davidhollandsworth/cultjustice23/burn-slow-sting.wav",
    "vocal_type" : "instrumental",
    "beats_per_minute" : "80",
    "file_path_compressed" : "davidhollandsworth/cultjustice23/burn-slow-sting.mp3",
    "file_path_uncompressed" : "davidhollandsworth/cultjustice23/burn-slow-sting.wav",

    "genres" : [ 
        "Tension", 
        "Americana", 
        "Tv Drama"
    ],
    "genres_keys" : [ 
        "tension", 
        "americana", 
        "tv drama"
    ],
    "moods" : [ 
        "tension", 
        "bluesy", 
        "spacey"
    ],
    "styles" : [ 
        "tv drama", 
        "unsolved mystery", 
        "western"
    ],
    "instruments" : [ 
        "dobro", 
        "banjo", 
        "percussion"
    ],
    "keywords" : [ 
        "rural-tension", 
        " showdown", 
        " apprehension", 
        " uncertainty", 
        " light-tension", 
        " strings-tension", 
        " heartland", 
        " trouble", 
        " uneasy", 
        " cautious", 
        " outlaw", 
        " yellowstone", 
        " bayou", 
        " gritty", 
        " swampy", 
        " swamp-people", 
        " southern", 
        " uncertain", 
        " drama", 
        " apprehension", 
        " bluesy", 
        " blues", 
        " shack", 
        " poor-folk", 
        " primitive"
    ],
    "sounds_like" : [ 
        "Brian Tyler", 
        "Max Richter", 
        "T.V. Drama"
    ],
    "resembles_song" : [ 
        "Hell on Wheels", 
        "Yellowstone", 
        "Rural/Outlaw/Tension"
    ],
    "last_modified" : 1674323659,
    "variation_count" : 5,
    "variations" : {
        "_id" : ObjectId("63cc26bc86ae1611380e1200"),
        "track_title" : "Burn Slow",
        "artist_name" : "David Hollandsworth",
        "master_track_id" : "63cc26bc86ae1611380e1200",
        "master_track" : ObjectId("63cc26bc86ae1611380e1200"),
        "merged" : 1,
        "variation_count" : 5,
        "variations" : {
            "63cc26bc86ae1611380e1200" : {
                "track_id" : "63cc26bc86ae1611380e1200",
                "track_title" : "Burn Slow",
                "artist_name" : "David Hollandsworth"
            },
            "63cc26c086ae1611380e1203" : {
                "track_id" : "63cc26c086ae1611380e1203",
                "track_title" : "Burn Slow (bed mix)",
                "artist_name" : "David Hollandsworth"
            },
            "63cc26c386ae1611380e1204" : {
                "track_id" : "63cc26c386ae1611380e1204",
                "track_title" : "Burn Slow (cutdown)",
                "artist_name" : "David Hollandsworth"
            },
            "63cc26c786ae1611380e1205" : {
                "track_id" : "63cc26c786ae1611380e1205",
                "track_title" : "Burn Slow (lows and perc)",
                "artist_name" : "David Hollandsworth"
            },
            "63cc26cb86ae1611380e1206" : {
                "track_id" : "63cc26cb86ae1611380e1206",
                "track_title" : "Burn Slow (sting)",
                "artist_name" : "David Hollandsworth"
            }
        }
    }
}

Currently I have the following struct for the track in my Golang model:目前我的 Golang model 中有以下轨道结构:

type Track struct {
    ID                   primitive.ObjectID `bson:"_id, omitempty" json:"_id"`
    TrackTitle           string             `bson:"track_title" json:"track_title"`
    ArtistId             string             `bson:"artist_id" json:"artist_id"`
    ArtistName           string             `bson:"artist_name" json:"artist_name"`
    AlbumTitle           string             `bson:"album_title" json:"album_title"`
    Composer             string             `bson:"composer" json:"composer"`
    Publisher            string             `bson:"publisher" json:"publisher"`
    Description          string             `bson:"description" json:"description"`
    Duration             string             `bson:"duration" json:"duration"`
    UrlPath              string             `bson:"url_path" json:"url_path"`
    VocalType            string             `bson:"vocal_type" json:"vocal_type"`
    BeatsPerMinute       string             `bson:"beats_per_minute" json:"beats_per_minute"`
    FilePathCompressed   string             `bson:"file_path_compressed" json:"bfile_path_compressed"`
    FilePathUncompressed string             `bson:"file_path_uncompressed" json:"file_path_uncompressed"`
    PreviewURL           string             `bson:"preview_url" json:"preview_url"`
    Genres               []interface{}      `bson:"genres" json:"genres"`
    GenresKeys           []interface{}      `bson:"genres_keys" json:"genres_keys"`
    Moods                []interface{}      `bson:"moods" json:"moods"`
    Styles               []interface{}      `bson:"styles" json:"styles"`
    Instruments          []interface{}      `bson:"instruments" json:"instruments"`
    Keywords             []interface{}      `bson:"keywords" json:"keywords"`
    SoundsLike           []interface{}      `bson:"sounds_like" json:"sounds_like"`
    ResemblesSong        []interface{}      `bson:"resembles_song" json:"resembles_song"`
    LastModified         int                `bson:"last_modified" json:"last_modified"`
    VariationCount       int                `bson:"variation_count" json:"variation_count"`
}

Currently all document fields are being decoded properly as JSON, however I'm at an impasse right now on how to struct the embedded "variations.variations" field (note that there variations within variations).目前所有文档字段都被正确解码为 JSON,但是我现在在如何构建嵌入式“variations.variations”字段方面陷入僵局(请注意,变化中存在变化)。 The structure of the embedded variations is an object with no key, rather a mongo ID string which is dynamic.嵌入式变体的结构是一个没有密钥的 object,而是一个动态的 mongo ID 字符串。

I have tried implementing a custom structs and interface types but to no avail.我尝试过实现自定义结构和接口类型,但无济于事。

If anyone has run into this issue before, any help would be appreciated.如果有人以前遇到过这个问题,我们将不胜感激。

I suggest to avoid using interface{} (or any ) whenever possible, use concrete types.我建议尽可能避免使用interface{} (或any ),使用具体类型。 Eg genres is a string array, in Go use []string .例如genres是一个字符串数组,在 Go 中使用[]string

For the variations.variations field you may use a map with string key and a struct type describing its elements.对于variations.variations字段,您可以使用带有string键和描述其元素的结构类型的map

type Track struct {
    ID                   primitive.ObjectID `bson:"_id, omitempty" json:"_id"`
    TrackTitle           string             `bson:"track_title" json:"track_title"`
    ArtistId             string             `bson:"artist_id" json:"artist_id"`
    ArtistName           string             `bson:"artist_name" json:"artist_name"`
    AlbumTitle           string             `bson:"album_title" json:"album_title"`
    Composer             string             `bson:"composer" json:"composer"`
    Publisher            string             `bson:"publisher" json:"publisher"`
    Description          string             `bson:"description" json:"description"`
    Duration             string             `bson:"duration" json:"duration"`
    UrlPath              string             `bson:"url_path" json:"url_path"`
    VocalType            string             `bson:"vocal_type" json:"vocal_type"`
    BeatsPerMinute       string             `bson:"beats_per_minute" json:"beats_per_minute"`
    FilePathCompressed   string             `bson:"file_path_compressed" json:"bfile_path_compressed"`
    FilePathUncompressed string             `bson:"file_path_uncompressed" json:"file_path_uncompressed"`
    PreviewURL           string             `bson:"preview_url" json:"preview_url"`
    Genres               []string           `bson:"genres" json:"genres"`
    GenresKeys           []string           `bson:"genres_keys" json:"genres_keys"`
    Moods                []string           `bson:"moods" json:"moods"`
    Styles               []string           `bson:"styles" json:"styles"`
    Instruments          []string           `bson:"instruments" json:"instruments"`
    Keywords             []string           `bson:"keywords" json:"keywords"`
    SoundsLike           []string           `bson:"sounds_like" json:"sounds_like"`
    ResemblesSong        []string           `bson:"resembles_song" json:"resembles_song"`
    LastModified         int                `bson:"last_modified" json:"last_modified"`
    VariationCount       int                `bson:"variation_count" json:"variation_count"`
    Variations           Variations         `bson:"variations" json:"variations"`
}

type Variations struct {
    ID             primitive.ObjectID   `bson:"_id" json:"_id"`
    TrackTitle     string               `bson:"track_title" json:"track_title"`
    ArtistName     string               `bson:"artist_name" json:"artist_name"`
    MasterTrackID  string               `bson:"master_track_id" json:"master_track_id"`
    MasterTrack    primitive.ObjectID   `bson:"master_track" json:"master_track"`
    Merged         int                  `bson:"merged" json:"merged"`
    VariationCount int                  `bson:"variation_count" json:"variation_count"`
    Variations     map[string]Variation `bson:"variations" json:"variations"`
}

type Variation struct {
    TrackID    string `bson:"track_id" json:"track_id"`
    TrackTitle string `bson:"track_title" json:"track_title"`
    ArtistName string `bson:"artist_name" json:"artist_name"`
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM