是否可以在结构之间进行转换?

假设我有以下两个结构


type Struct1 struct {

   name string

   details interface{}

}


type AddressDetails struct {

   street string

}


type StructDetails struct {

   Struct1

   details AddressDetails

}

我得到 JSON 格式的输入并将其转换为Struct1. 现在是否可以将其转换为StructDetailsgolang 而无需再次编组和解组?我试过这个,但我得到一个错误


繁星coding
浏览 97回答 2
2回答

翻过高山走不出你

您可以使用出色的mapstructure库将 amap[string]interface{}转换为您想要的结构。这样,您只需将数据 JSON 解码为 map[string]interface{},然后将此映射解码为您需要的结构。例子:package mainimport (    "fmt"    "encoding/json"    "github.com/mitchellh/mapstructure")func main() {    myJson := "{\"name\": \"someName\", \"age\": 20, \"job\": \"teacher\"}"    myMap := make(map[string]interface{})    err := json.Unmarshal([]byte(myJson), &myMap)    if err != nil {        panic(err)    }    person := &Person{}    adult := &Adult{}    err = mapstructure.Decode(myMap, person)    if err != nil {        panic(err)    }    fmt.Printf("Person: %#v\n", person)    err = mapstructure.Decode(myMap, adult)    if err != nil {        panic(err)    }    fmt.Printf("Adult: %#v\n", adult)}// Structstype Person struct {    Name string `mapstructure:"name" json:"name"`    Age int `mapstructure:"age" json:"age"`}type Adult struct {    Person `mapstructure:",squash"`    Job string `mapstructure:"job" json:"job"`}在Go Playground中查看它的实际效果。

侃侃尔雅

您可以编写函数映射Struct1到StructDetailsfunc ToStructDetails(s Struct1, d string) *StructDetails {    return &StructDetails{s, AddressDetails{d}}}除了进行映射之外,没有办法强制进行转换。解组后的其他方式s := Struct1{"name", "details"}var sd StructDetailssd.Struct1 = sfmt.Println(sd) // {{name details} {}}sd.details = AddressDetails{"address"}fmt.Println(sd) // {{name details} {address}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go