2 回答

TA貢獻1858條經驗 獲得超8個贊
僅當您使用反射即時重建結構時,您才能做到這一點。這里有一個包(我沒試過)。
但我建議您為結構編寫一個自定義 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 標記的字節切片。
- 2 回答
- 0 關注
- 119 瀏覽
添加回答
舉報