我正在研究 Go 模块实现以抽象与其他对等方的通信。该模块背后的想法是通过 MQ 以标准消息格式发送/接收消息,其中几乎可以携带任何类型的“实体”。但是我发现解决 Go 中的类型转换非常困难。
这是我正在尝试做的一个片段(https://play.golang.org/p/Orb1vNdulY1)。
type Message struct {
Code string
Entity interface{}
}
type Cartoon struct {
Name string
Show string
}
func main() {
cartoon := Cartoon{Name: "Doug Funnie", Show: "Doug"}
msg := Message{Code: "12345", Entity: cartoon}
payload, err := json.Marshal(msg)
fmt.Println("JSON Sent:", string(payload))
// Here json message gets sent to a MQ broker
// Here json message gets read by a consumer
var message Message
err = json.Unmarshal(payload, &message)
fmt.Println("Message Received:", message)
var cart Cartoon
cart = message.Entity.(Cartoon)
fmt.Println("Cartoon Received:", cart)
}
在这一行,我收到以下错误:
cart = message.Entity.(Cartoon)
恐慌:界面转换:界面{}是地图[字符串]界面{},而不是main.Cartoon
问题是,因为它旨在成为“通用”实体类型的模块,所以在将消息传递给消费者应用程序之前,我不知道实体类型(结构)。
所以我需要一种方法将结构的实例传递给应用程序,甚至允许消费者应用程序转换为它期望接收的类型(结构)。
即使有一种更简单优雅的方式来做我想做的事,即使我必须更改我的 Message 结构,我也可以考虑解决方案。
我想出解决这个问题的唯一方法是将Message.Entity转换为包含原始 json 内容的字符串字段,然后消费者应用程序将其解组为所需的类型。不是那么优雅。
原始字符串/json 解决方案(https://play.golang.org/p/c9bgAbI7SZh)。
有什么想法吗?
繁星淼淼
慕桂英4014372
30秒到达战场
相关分类