我想知道是否有人可以解释如何将我的changefeed游标值解组为特定的结构类型。
var message map[string]interface{}
for chatFeedCursor.Next(&message) {
fmt.Println(message)
}
地图[new_val:地图[club_id:ea2eb6e2-755f-4dad-922D-e3693b6e55c6 日期:2017-04-07 14:48:17.714 +0100 +01:00 id:e389ab54-963e-4b33-9b34-adcb6ec5b17e留言:生命是什么意思? user_id:00ff679f-9421-4b8b-ae7f-d11cf2adaee2] old_val:]
但是,我希望将响应映射到struct ChatMessage。
更新
我试过了:
var message ChatMessage
但是,似乎我的任何数据都没有在结构中设置。
{0001-01-01 00:00:00 +0000 UTC}
我的结构:
type ChatMessage struct {
ID string `json:"id" gorethink:"id,omitempty"`
UserID string `json:"user_id" gorethink:"user_id"`
ClubID string `json:"club_id" gorethink:"club_id"`
Message string `json:"message" gorethink:"message"`
Date time.Time `json:"date" gorethink:"date"`
}
感谢。
答案 0 :(得分:0)
我明白了!
问题是我没有在rethinkdb更改请求中指定字段。
上一个代码:
chatFeedCursor, _ := gorethink.Table("club_chat").Changes().Run(gorethinkSession)
工作代码:
chatFeedCursor, _ := gorethink.Table("club_chat").Changes().Field("new_val").Run(gorethinkSession)
现在.Next()值映射到我的struct而没有任何问题。
答案 1 :(得分:0)
如果您想将changefeed游标值解编为特定的结构类型,而又保留新值和旧值,则可以使用库将通用地图值解码为本地Go结构,例如mapstructure,获得整洁的结果:
导入地图结构:
import (
...
"github.com/mitchellh/mapstructure"
...
)
现在您可以执行以下操作:
cursor, err := r.Table("club_chat").
Changes().
Run(db.Session)
if err != nil {
// manage error
}
var changeFeed map[string]interface{}
for cursor.Next(&changeFeed) {
var oldVal, newVal ChatMessage
if changeFeed["old_val"] != nil {
mapstructure.Decode(changeFeed["old_val"], &oldVal)
}
if changeFeed["new_val"] != nil {
mapstructure.Decode(changeFeed["new_val"], &newVal)
}
// Do what you want with the values