英文:
Best practices working with JSON in Go
问题
我正在开始编写一个使用Go语言的聊天应用程序,并开始思考如何最好地处理JSON。我已经阅读了不同的文章,似乎我必须为客户端发送的每个操作创建一个不同的类型。
假设有三个操作:
- NewMessage(新消息)
- DeleteMessage(删除消息)
- EditMessage(编辑消息)
据我理解,我必须创建三个与这些操作匹配的类型。类似于这样:
type Message struct {
Action string `json:"action"`
Data map[string]*json.RawMessage `json:"data"`
}
type MessageMeta struct {
UserId int `json:"user_id"`
ChannelID int `json:"channel_id"`
}
type NewMessageAction struct {
MessageMeta
Message string `json:"message"`
}
type EditMessageAction struct {
MessageMeta
MessageId int `json:"message_id"`
Message string `json:"message"`
}
type DeleteMessageAction struct {
MessageMeta
MessageId int `json:"message_id"`
}
我来自Node.js世界(虽然我不想比较这两者),对我来说,为每个操作创建和维护一个类型似乎有点冗长。如果有成百上千个操作怎么办?
英文:
I'm in the beginning of writing a chat app in Go and started wondering what is the best way working with JSON. I've read different articles and it seems like I have to create a different type for every action the client sends.
Lets say there are three actions:
NewMessage
DeleteMessage
EditMessage
To my understanding I have to create three types that match these actions. Something like this:
type Message struct {
Action string `json:"action"`
Data map[string]*json.RawMessage `json:"data"`
}
type MessageMeta struct {
UserId int `json:"user_id"`
ChannelID int `json:"channel_id"`
}
type NewMessageAction struct {
MessageMeta
Message string `json:"message"`
}
type EditMessageAction struct {
MessageMeta
MessageId int `json:"message_id"`
Message string `json:"message"`
}
type DeleteMessageAction struct {
MessageMeta
MessageId int `json:"message_id"`
}
I come from Node.js world (although I don't want to compare the two) and to me it seems a bit too verbose to create and maintain a type for every action there is. What if there are hundreds of actions?
答案1
得分: 2
Go是一种强类型的编程语言。它没有像JavaScript那样的松散类型。
如果你想为每个消息定义一个强类型的数据类型,那么你需要为每种类型编写一个结构体。否则,你可以将消息解组为map[string]interface{}
(用于“通用”JSON对象),并使用它进行操作(这将需要类型断言将interface
值转换为强类型)。
英文:
Go is a strongly typed programming language. There are no loose types like in JavaScript.
If you want a strong data type for each message, then you'll need to write a struct for each type. Otherwise you can unmarshal the message into a map[string]interface{}
(for "generic" JSON objects) and work with that instead (which will require type assertions to convert the interface
values into strong types).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论