我需要使用帶有動態標簽的泛型創建結構
例如,我們有一個帶有泛型
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"`
}
uj5u.com熱心網友回復:
只有當你使用反射即時重建你的結構時,你才能做到這一點。這里有一個包(我沒試過)。
但相反,我建議您為基于變數型別處理案例的結構撰寫自定義 MarshalJSON 方法。
package main
import (
"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 標簽的位元組切片。
uj5u.com熱心網友回復:
這是不可能的!
對于您的情況,您可以重新設計您的架構
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/511350.html
標籤:去仿制药
上一篇:使用反射從泛型結構中獲取型別引數
