当前位置: 首页 > 面试题库 >

Golang将接口{}转换为struct

韩弘阔
2023-03-14
问题内容

我想在下面的代码中改进getCustomerFromDTO方法,我需要从interface {}创建一个结构,目前我需要将该接口编组为byte
[],然后将数组解组为我的结构-必须有更好的方法。

我的用例是,我通过rabbitmq发送结构,然后使用具有其他特定于域的数据的通用DTO包装器来发送它们。当我从Rabbit
MQ接收DTO时,消息下方的一层将被封送给我的DTO,然后我需要从该DTO获取我的结构。

type Customer struct {
    Name string `json:"name"`
}

type UniversalDTO struct {
    Data interface{} `json:"data"`
    // more fields with important meta-data about the message...
}

func main() {
    // create a customer, add it to DTO object and marshal it
    customer := Customer{Name: "Ben"}
    dtoToSend := UniversalDTO{customer}
    byteData, _ := json.Marshal(dtoToSend)

    // unmarshal it (usually after receiving bytes from somewhere)
    receivedDTO := UniversalDTO{}
    json.Unmarshal(byteData, &receivedDTO)

    //Attempt to unmarshall our customer
    receivedCustomer := getCustomerFromDTO(receivedDTO.Data)
    fmt.Println(receivedCustomer)
}

func getCustomerFromDTO(data interface{}) Customer {
    customer := Customer{}
    bodyBytes, _ := json.Marshal(data)
    json.Unmarshal(bodyBytes, &customer)
    return customer
}

问题答案:

解组DTO之前,请将Data字段设置为所需的类型。

type Customer struct {
    Name string `json:"name"`
}

type UniversalDTO struct {
    Data interface{} `json:"data"`
    // more fields with important meta-data about the message...
}

func main() {
    // create a customer, add it to DTO object and marshal it
    customer := Customer{Name: "Ben"}
    dtoToSend := UniversalDTO{customer}
    byteData, _ := json.Marshal(dtoToSend)

    // unmarshal it (usually after receiving bytes from somewhere)
    receivedCustomer := &Customer{}
    receivedDTO := UniversalDTO{Data: receivedCustomer}
    json.Unmarshal(byteData, &receivedDTO)

    //done
    fmt.Println(receivedCustomer)
}

如果您无法Data在解组前在DTO上初始化字段,则可以在解组后使用类型断言。encoding/jsoninterface{}类型值unamrshals
打包到中map[string]interface{},因此您的代码将如下所示:

type Customer struct {
    Name string `json:"name"`
}

type UniversalDTO struct {
    Data interface{} `json:"data"`
    // more fields with important meta-data about the message...
}

func main() {
    // create a customer, add it to DTO object and marshal it
    customer := Customer{Name: "Ben"}
    dtoToSend := UniversalDTO{customer}
    byteData, _ := json.Marshal(dtoToSend)

    // unmarshal it (usually after receiving bytes from somewhere)
    receivedDTO := UniversalDTO{}
    json.Unmarshal(byteData, &receivedDTO)

    //Attempt to unmarshall our customer
    receivedCustomer := getCustomerFromDTO(receivedDTO.Data)
    fmt.Println(receivedCustomer)
}

func getCustomerFromDTO(data interface{}) Customer {
    m := data.(map[string]interface{})
    customer := Customer{}
    if name, ok := m["name"].(string); ok {
        customer.Name = name
    }
    return customer
}


 类似资料:
  • 问题内容: 我正在使用github.com/fatih/structs包将struct的所有字段的值转换为函数。看这里。这工作正常,但最终我想通过使用csv包将值写入csv文件。该功能需要作为输入。 简而言之:我如何轻松地将的输出转换为字符串数组? 问题答案: 即使所有值都是具体类型,也不能简单地转换为,因为这两种类型具有不同的内存布局/表示形式。 您必须定义如何用值表示不同类型的值。 最简单和明

  • 问题内容: 在进行中,是否可以通过某种方式动态地转换变量? 例如,如果简单的转换将是: 如果我事先不知道年龄是整数怎么办?一种简单的书写方式是 有没有办法实现这样的目标?反射包提供了一些在运行时确定或强制转换类型的方法-但我找不到像上述提到的东西(适用于所有类型的通用方案)。 问题答案: 不,你不能。Go是一种静态类型的语言。变量的类型在编译时确定。 如果要动态确定的,可以使用类型切换:

  • 问题内容: 我正在尝试编写一个将接受所有数据类型的哈希。一旦进入函数,我将数据作为字节数组处理。我在弄清楚如何将任意类型转换为字节数组时遇到麻烦。 我尝试使用二进制包,但它似乎取决于传入的数据类型。fn (docs)的参数之一需要知道参数的字节顺序。 所有数据类型的大小都是字节的某个倍数(甚至是布尔值),因此理论上这应该很简单。 下面有问题的代码, 问题答案: 代码中的其他问题使我较早离开了软件包

  • 问题内容: 在以下代码段中,尝试将nil接口转换为某物的指针失败,并出现以下错误: 在此处播放链接:https : //play.golang.org/p/2cgyfUStCI 为什么这会完全失败?完全有可能做 ,所以我想知道如何从nil接口开始实现类似的效果。 问题答案: 这是因为 静态 类型的变量(只是一个接口)可能包含许多不同 动态 类型的值。 是的,因为工具,您的变量 可能 持有类型的值,

  • 问题内容: 我正在尝试为Erlang编写Golang驱动程序,可通过Erlang端口访问。 我从Erlang C端口示例开始,该示例运行良好: http://www.erlang.org/doc/tutorial/c_port.html 现在,我正在尝试将C代码移植到Golang。只是尝试使用“ \ n”作为分隔符来回显简单的“ Hello World \ n”消息。 所以我的Golang代码如下

  • 问题内容: 无法将image.image转换为[] byte。问题点用虚线包裹。 基本上,我需要new_image为[] byte格式,以便可以将其发送到我的S3存储桶。 谢谢您的帮助。 问题答案: 您需要一个byte.Buffer,而不是bufio.Writer。bytes.Buffer在需要写入器的写入器时使用。bufio.Writer只是在将数据转发到另一个写入器之前将其缓存在内存中。