我正在使用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)但是,当我运行存储桶的Update函数时。我查了沙发数据库。密钥为"key123“的文档消失了。看起来更新并没有更新这个值,而是删除了它。发生了什么?
发布于 2014-08-14 19:35:24
您需要创建一个与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和Go的blog上的所有帖子,从First Class Functions in Go开始。
发布于 2014-08-15 08:45:22
与我在go-坚果列表上发布的答案相同,以防万一:
你不必自己定义UpdateFunc类型,它已经在这里定义了:
https://github.com/couchbaselabs/go-couchbase/blob/master/client.go#L608
只需正常定义函数并将其作为参数传递,或者像在其他语言中那样传递匿名函数即可。
下面是一个简单的例子:
http://play.golang.org/p/YOKxRtQqmU
https://stackoverflow.com/questions/25304080
复制相似问题