为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
繁星coding 2022-05-23 16:24:03
假设我有以下两个结构type Struct1 struct {   name string   details interface{}}type AddressDetails struct {   street string}type StructDetails struct {   Struct1   details AddressDetails}我得到 JSON 格式的输入并将其转换为Struct1. 现在是否可以将其转换为StructDetailsgolang 而无需再次编组和解组?我试过这个,但我得到一个错误
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

您可以使用出色的mapstructure库将 amap[string]interface{}转换为您想要的结构。这样,您只需将数据 JSON 解码为 map[string]interface{},然后将此映射解码为您需要的结构。


例子:


package main


import (

    "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)

}


// Structs


type 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中查看它的实际效果。


查看完整回答
反对 回复 2022-05-23
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

您可以编写函数映射Struct1到StructDetails


func ToStructDetails(s Struct1, d string) *StructDetails {

    return &StructDetails{s, AddressDetails{d}}

}

除了进行映射之外,没有办法强制进行转换。


解组后的其他方式


s := Struct1{"name", "details"}

var sd StructDetails

sd.Struct1 = s

fmt.Println(sd) // {{name details} {}}

sd.details = AddressDetails{"address"}

fmt.Println(sd) // {{name details} {address}}


查看完整回答
反对 回复 2022-05-23
  • 2 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信