Table of Contents
Question content
Solution
Home Backend Development Golang Golang structure for nested objects

Golang structure for nested objects

Feb 09, 2024 pm 04:39 PM
string array

用于嵌套对象的 Golang 结构

php editor Apple shared a detailed introduction to the structure used for nested objects in the Golang language. In Golang, the nested object structure is a powerful feature that allows us to nest other structures or interface types within a structure. Through the structure of nested objects, we can easily combine and reuse code, improving the readability and maintainability of the code. Not only that, the structure of nested objects can also achieve the effect of multiple inheritance, allowing us to design and build complex data structures more flexibly. In this article, we will discuss in detail the methods and techniques of using the structure of nested objects in Golang to help readers better understand and apply this feature.

Question content

I am currently using gofiber v2 to create golang api.

I have the following document structure for a music track in a mongo database:

{
    "_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"
            }
        }
    }
}
Copy after login

Currently, I have the following track structure in my 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"`
}
Copy after login

Currently all document fields are correctly decoded to json, but I'm now stuck on how to construct the embedded "variations.variations" field (note that there are variations within variations). The structure of the embedded variant is an object without a key, but a dynamic mongo id string.

I tried implementing custom struct and interface types but without success.

If anyone has encountered this problem before, any help would be greatly appreciated.

Solution

I recommend avoiding interface{} (or any) if possible and use concrete types. For example. genres is an array of strings, using []string in go.

For variations.variations fields, you can use map as well as string keys and struct types describing their elements.

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"`
}
Copy after login

The above is the detailed content of Golang structure for nested objects. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months ago By 尊渡假赌尊渡假赌尊渡假赌
Two Point Museum: All Exhibits And Where To Find Them
1 months ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to use split() function in oracle How to use split() function in oracle May 07, 2024 pm 01:06 PM

The SPLIT() function splits a string into an array by a specified delimiter, returning a string array where each element is a delimiter-separated portion of the original string. Usage includes: splitting a comma-separated list of values ​​into an array, extracting filenames from paths, and splitting email addresses into usernames and domains.

How to sort strings in java How to sort strings in java Apr 02, 2024 am 02:18 AM

Ways to sort strings in Java: Use the Arrays.sort() method to sort an array of strings in ascending order. Use the Collections.sort() method to sort a list of strings in ascending order. Use the Comparator interface for custom sorting of strings.

What does \0 mean in c language What does \0 mean in c language Apr 27, 2024 pm 10:54 PM

In C language, \0 is the end mark of a string, called the null character or terminator. Since strings are stored in memory as byte arrays, the compiler recognizes the end of the string via \0, ensuring that strings are handled correctly. \0 How it works: The compiler stops reading characters when it encounters \0, and subsequent characters are ignored. \0 itself does not occupy storage space. Benefits include reliable string handling, improved efficiency (no need to scan the entire array to find the end), and ease of comparison and manipulation.

What does args mean in java What does args mean in java May 07, 2024 am 02:24 AM

args is a special parameter array of the main method in Java, used to obtain a string array of command line parameters or external input. By accessing the args array, the program can read these arguments and process them as needed.

What does args mean in java What does args mean in java Apr 25, 2024 pm 10:15 PM

args stands for command line arguments in Java and is an array of strings containing the list of arguments passed to the program when it is started. It is only available in the main method, and its default value is an empty array, with each parameter accessible by index. args is used to receive and process command line arguments to configure or provide input data when a program starts.

How to sort Chinese characters in C language environment? How to sort Chinese characters in C language environment? Feb 18, 2024 pm 02:10 PM

How to implement Chinese character sorting function in C language programming software? In modern society, the Chinese character sorting function is one of the essential functions in many software. Whether in word processing software, search engines or database systems, Chinese characters need to be sorted to better display and process Chinese text data. In C language programming, how to implement the Chinese character sorting function? One method is briefly introduced below. First of all, in order to implement the Chinese character sorting function in C language, we need to use the string comparison function. Ran

What impact do C++ functions have on program performance? What impact do C++ functions have on program performance? Apr 12, 2024 am 09:39 AM

The impact of functions on C++ program performance includes function call overhead, local variable and object allocation overhead: Function call overhead: including stack frame allocation, parameter transfer and control transfer, which has a significant impact on small functions. Local variable and object allocation overhead: A large number of local variable or object creation and destruction can cause stack overflow and performance degradation.

Where is the starting point of C language program? Where is the starting point of C language program? Feb 20, 2024 pm 12:12 PM

What is the starting point for running a C language program? C language, as a high-level programming language, is one of the most commonly used programming languages. In the process of learning C language, many people will be confused about the starting point of running C program. So, what is the starting point for running a C language program? The answer is the main function. In C language programs, the execution of the program starts from the beginning of the main function. The main function is the entry point of the C language program and the first function defined by the programmer to be executed. Its main function is to define the process

See all articles