如何通过泛型更改结构标签

我需要使用带有动态标签的泛型创建结构


例如,我们有一个具有泛型Phone[T]和简单结构的结构Company


所以电话可以属于公司,这意味着我们的类型是Phone[Company]


type Company struct{}


type Phone[T any] struct{

   number string `json:"phone_number"`

}

让我们创建新变量Phone[Company]

phone1 := Phone[Company]{

   number: "+18888888888"

}

序列化的输出phone1是

{

   "phone_number": "+18888888888"

}

问题

如何Phone[T]动态设置结构类型字段标签以接收 jsoncompany_phone_number而不是phone_number?


我如何在 golang 标签中使用泛型类型?


例如


type Phone[T any] struct{

   number string `json:"${T or replica name of T type e.t.c}_phone_number"`

}


一只萌萌小番薯
浏览 89回答 2
2回答

猛跑小猪

仅当您使用反射即时重建结构时,您才能做到这一点。这里有一个包(我没试过)。但我建议您为结构编写一个自定义 MarshalJSON 方法,该方法根据变量的类型处理案例。package mainimport (    "encoding/json"    "errors"    "fmt")type Phone[T any] struct {    variableType T    Number       string}func (p Phone[T]) MarshalJSON() ([]byte, error) {    switch any(p.variableType).(type) {    case Company:        return json.Marshal(&struct {            Number string `json:"company_phone_number"`        }{            Number: p.Number,        })    case Company2:        return json.Marshal(&struct {            Number string `json:"company2_phone_number"`        }{            Number: p.Number,        })    }    return []byte{}, errors.New("Invalid type")}type Company struct {}type Company2 struct {}func main() {    p := Phone[Company]{        Number: "123",    }    p2 := Phone[Company2]{        Number: "321",    }    data1, _ := json.Marshal(p)    data2, _ := json.Marshal(p2)    fmt.Println(p, string(data1))    fmt.Println(p2, string(data2))}如果你想避免开关,你可以获得变量类型,reflect.TypeOf(p.variableType).Name()但是你必须编写一个自定义 JSON 封送拆收器来表示带有自定义 json 标记的字节切片。

桃花长相依

这不可能!对于您的情况,您可以重新设计您的架构
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go