Golang中的回调

时间:2014-08-14 09:00:51

标签: callback go couchbase

我正在使用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”键的文件消失了。似乎更新不更新值但删除它。发生了什么事?

2 个答案:

答案 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以及blogFirst Class Functions in Go开头的所有帖子。

答案 1 :(得分:3)

我在go-nuts列表上发布了相同的答案,以防万一:

您不必自己定义UpdateFunc类型,它已在此处定义:

https://github.com/couchbaselabs/go-couchbase/blob/master/client.go#L608

只需正常定义函数并将其作为参数传递或传递匿名函数,就像在其他语言中一样。

这是一个简单的例子:

http://play.golang.org/p/YOKxRtQqmU