golang 模型中的可选额外信息

问题描述 投票:0回答:1

我在golang中为后端实现了三个模型 类别、产品和文档 模型定义如下

type Category struct {
  ID uint
  Title string
  Products []*Product
}

type Product struct {
  ID uint
  Name string
  CategoryID uint
  Documents []*Document
}

type Document struct {
  ID uint
  Title string
  MimeType string
  Url string
  ProductID uint
}

有不同的类别,我想要的是接收除某些类别的文档中的信息之外的信息。例如,当类别为墙实例时,还应考虑墙的尺寸和结构。 它存在于某些类别中,每个类别都应该接收除默认文档中的内容之外的附加信息。 我的问题是,我该如何解决这个问题?

go backend go-gorm
1个回答
0
投票

您可以使用泛型来实现这一点:


package main

import "fmt"

type Wall struct {
    Size      int
    Structure string
}

type Category[Spec any] struct {
    ID       uint
    Title    string
    Products []*Product[Spec]
}

func (s Category[Spec]) Dump() {
    fmt.Printf("%+v\n(", s)
    for id := range s.Products {
        s.Products[id].Dump()
    }
}

type Product[Spec any] struct {
    ID         uint
    Name       string
    CategoryID uint
    Documents  []*Document[Spec]
}

func (p Product[Spec]) Dump() {
    fmt.Printf("%+v\n(", p)
    for id := range p.Documents {
        fmt.Printf("%+v\n(", p.Documents[id])
    }
}

type Document[Spec any] struct {
    Spec      Spec
    ID        uint
    Title     string
    MimeType  string
    Url       string
    ProductID uint
}

func main() {
    wall := Category[Wall]{
        ID:    1,
        Title: "a",
        Products: []*Product[Wall]{{
            ID:         1,
            Name:       "b",
            CategoryID: 1,
            Documents: []*Document[Wall]{{
                Spec: Wall{
                    Size:      12,
                    Structure: "c",
                },
                ID:        1,
                Title:     "d",
                MimeType:  "e",
                Url:       "https://f.com",
                ProductID: 1,
            }},
        }},
    }
    wall.Dump()
}

输出:

{ID:1 Title:a Products:[0xc00007c040]}
({ID:1 Name:b CategoryID:1 Documents:[0xc000066180]}
(&{Spec:{Size:12 Structure:c} ID:1 Title:d MimeType:e Url:https://f.com ProductID:1}
© www.soinside.com 2019 - 2024. All rights reserved.