我刚刚意识到可以在一个语句中进行映射查找和类型/接口断言.
m := map[string]interface{}{
"key": "the value",
}
if value, ok := m["key"].(string); ok {
fmt.Printf("value exists and is a string: %s\n", value)
} else {
fmt.Println("value does not exist or is not a string")
}
Run Code Online (Sandbox Code Playgroud)
这被认为是坏事吗?我没有看到任何官方文件评论这一点.
编辑:我知道这段代码无法区分"密钥不存在"和"值是不正确的类型".
edit2:ahem,else子句中的print是不正确的:(
我有一张桌子,桌子上有一堆文件,这些文件会定期(部分)进行更新。
我本质上想做的是创建另一个表(changes以下称为表),该表存储每个文档的最新N个更改。
因此table.changes(),我要做的是获取表上的所有更改,计算所需的diff信息(diffentry在下面称为),然后将该信息添加到另一个表中的数组中:
changes.get(doc_id).update({
'diffs': R.row['changes'].prepend(diffentry)
}).run()
Run Code Online (Sandbox Code Playgroud)
这个棘手的地方是如何限制diffs数组的大小?
有一个delete_at()可以从数组中删除一个或多个项目的数组方法,我可以 “蛮力”调用,例如:
delete_at(diff_limit, diff_limit + 10000)
Run Code Online (Sandbox Code Playgroud)
并忽略任何错误(疯狂的上限只是偏执狂)。但这有点脏...
我认为更好,更好的方法是对大于限制的数组进行过滤并删除多余的位。伪:
changes.get(doc_id).filter(R.row['diffs'].length > diff_limit).update({
'diffs': R.row['diffs'].delete_at(diff_limit, R.row['diffs'].length - 1)
}).run()
Run Code Online (Sandbox Code Playgroud)
但是,可惜,length我还没有发现……关于如何以一种不错的方式来做这种事情的任何想法?