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

除了使用接口和使用扩展运算符之外如何创建动态结构

除了使用接口和使用扩展运算符之外如何创建动态结构

Go
动漫人物 2023-03-15 13:50:31
我正在尝试使用 Go 和 Fiber 框架创建新的 API。我正在使用 MongoDB。请参考我下面的结构type Product struct {    Name           string              `json:"name"`    Code           string              `json:"code"`    Description    string              `json:"description"`    Brand          string              `json:"brand"`    Variants       []map[string]string `json:"variants"`    Categories     []int               `json:"categories"`}Variants 字段将有另一组对象数组。但是这些领域将是动态的。所以我无法定义结构。现在我用 []map[string][string] 解决了这个问题。我在这里的任务是用以下格式形成 CSV 文件。[{    Name: "Rock",    Code: "RRR"    Description: "This is rock"    Brand: "R"    ...variants},{    Name: "Rock",    Code: "RRR"    Description: "This is rock"    Brand: "R"    ...variants},{    Name: "Rambo",    Code: "RAM"    Description: "This is Rambo"    Brand: "RA"    ...variants},{    Name: "Rambo",    Code: "RAM"    Description: "This is Rambo"    Brand: "RA"    ...variants}]每行只有变体会发生变化。其他人将保持不变,我形成了除变体之外的其他领域。我无法创建结构,因为数据是动态的。我有很多困惑如何为动态字段创建结构如何在根级别传播变体我来自javascript。所以,我们使用了传播运算符。在这里,我对如何在 Golang 中做到这一点感到困惑。
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

如果您愿意,可以使用反射动态构造新结构


下面是一个例子:


package main


import (

    "encoding/json"

    "fmt"

    "reflect"

)


type DynamicMap map[string]interface{}


type Product struct {

    Name        string            `json:"name"`

    Code        string            `json:"code"`

    Description string            `json:"description"`

    Brand       string            `json:"brand"`

    Variants    map[string]string `json:"variants"`

    Categories  []int             `json:"categories"`

}


func (j Product) MarshalJSON() ([]byte, error) {

    m := DynamicMap{}

    t := reflect.TypeOf(j)

    v := reflect.ValueOf(j)

    for i := 0; i < t.NumField(); i++ {

        if t.Field(i).Tag.Get("json") == "variants" {

            dyn := v.Field(i).Interface().(map[string]string)

            for key, val := range dyn {

                m[key] = val

            }

        } else if t.Field(i).Type.Kind() == reflect.String {

            m[t.Field(i).Tag.Get("json")] = v.Field(i).String()

        } else {

            m[t.Field(i).Tag.Get("json")] = v.Field(i)

        }


    }

    return json.Marshal(m)

}


func (j Product) UnmarshalJSON(data []byte) error {

    fmt.Println("Unmarshal...")

    return json.Unmarshal(data, &j)

}


func main() {

    p := Product{Name: "aa", Variants: map[string]string{"a": "a", "b": "b"}}

    marshal, err := json.Marshal(p)

    if err != nil {

        fmt.Printf("%v\n", err)

    }

    fmt.Printf("%s\n", marshal)

}


{"a":"a","b":"b","brand":"","categories":{},"code":"","description":"","name":"aa"} 


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

添加回答

举报

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