我正致力于http://gary.burd.info/go-websocket-chat的扩展。
此示例通过websockets发送原始文本。
我想改用JSON数据。
我在Go代码中做了一些结构,但当我将其转换为JSON以将其写入客户端时,嵌套结构不在结果中。
一些代码:
type(
ChatroomData struct {
Token string `json:"token"`
Chatroom *Chatroom `json:"chatroom"`
}
Message struct {
Token string `json:"token,omitempty"`
Type string `json:"type"`
Author string `json:"author"`
Content string `json:"content"`
Chatroom string `json:"chatroom"`
}
Messages []Message
)
聊天室结构:
Chatroom struct {
Name string `json:"name"`
Users []User `json:"users"`
Messages Messages `json:"messages"`
Hub *WsHub `json:"-"`
}
Chatrooms map[string]*Chatroom
User struct {
username string `json:"username"`
token string `json:"-"`
}
Users []User
启动聊天室:
func (s *Server) startMainChatroom() {
s.Chatrooms["main"] = &Chatroom{
Name: "main",
Users: make([]User, 0),
Messages: make([]Message, 0),
Hub: NewHub(),
}
go s.Chatrooms["main"].Hub.Run()
}
将消息附加到聊天室的方式:
message := Message{}
json.Unmarshal([]byte(data), &message)
message.Token = ""
message.Type = "message"
chatroom.Messages = append(chatroom.Messages, message)
将数据发送到客户端:
func (u *User) SendChatroomData(w http.ResponseWriter, c *Chatroom, status int) {
chatroomData := ChatroomData{Token: u.token, Chatroom: c}
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Headers", "accept, authorization")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST")
w.WriteHeader(status)
if err := json.NewEncoder(w).Encode(&chatroomData); err != nil {
panic(err)
}
}
打印结果为:
{
"token":"a638ed3ba0c30ba3d0810fc79e12a50a",
"chatroom":{
"name":"main",
"users":[{},{}],
"messages":[]
}
}
发送了两个用户和三封邮件。如果我使用fmt.Printf("%v\n", chatroom.Messages)
,我会正确存储三条消息。对于用户来说,当我转储数据时,数据就在这里。
很多事情很奇怪:
messages
键保持空白?users
键没有,但切片项是空的?(由Mike Reedell解决)感谢您的帮助,如果需要,请不要再向我提出更多代码。我希望我的帖子已经太长了(并没有太多的英语错误X))!
答案 0 :(得分:1)
go JSON编组程序仅输出导出(大写)字段。 User
结构中的字段是未导出的(小写),这意味着JSON封送程序不知道它们在那里并且无法输出它们。
答案 1 :(得分:0)
问题完全在别处:由于我对指针的误解,我在添加一些消息时使用的聊天室实例没有正确绑定到s.Chatrooms["main"]
。
当我整理s.Chatrooms["main"]
时,消息不在里面!
Ty为你提供帮助!
我希望这会帮助其他一些学习者:D