我正在使用go-couchbase将数据更新到couchbase,但是,我在如何使用回调函数时遇到了问题。
函数Update
要求我传递一个回调函数,其函数应为UpdateFunc
func (b *Bucket) Update(k string, exp int, callback UpdateFunc) error
这就是我所做的
首先,我声明了一个类型UpdateFunc
:
type UpdateFunc func(current []byte) (updated []byte, err error)
然后在代码中,我添加以下行:
fn := UpdateFunc{func(0){}}
然后调用Update
函数:
bucket.Update("12345", 0, fn()}
但Go返回以下错误:
syntax error: unexpected literal 0, expecting ) for this line fn := UpdateFunc{func(0){}}
那么我做错了什么?那么如何才能使回调函数有效呢?
感谢你的所有建议。现在我可以按如下方式运行回调函数:
myfunc := func(current []byte)(updated []byte, err error) {return updated, err }
myb.Update("key123", 1, myfunc)
然而,当我运行桶的更新功能时。我检查了沙发数据库。带有“key123”键的文件消失了。似乎更新不更新值但删除它。发生了什么事?
答案 0 :(得分:5)
您需要创建一个与couchbase.UpdateFunc
签名匹配的函数,然后将其传递给bucket.Update
。
例如:
fn := func(current []byte) (updated []byte, err error) {
updated = make([]byte, len(current))
copy(updated, current)
//modify updated
return
}
....
bucket.Update("12345",0,fn)
请注意,要传递一个函数,您只需传递fn
而不是fn()
,这实际上会立即调用该函数并传递它的返回值。
我强烈建议您停止阅读Effective Go以及blog以First Class Functions in Go开头的所有帖子。
答案 1 :(得分:3)
我在go-nuts列表上发布了相同的答案,以防万一:
您不必自己定义UpdateFunc类型,它已在此处定义:
https://github.com/couchbaselabs/go-couchbase/blob/master/client.go#L608
只需正常定义函数并将其作为参数传递或传递匿名函数,就像在其他语言中一样。
这是一个简单的例子: