首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang回调

Golang回调
EN

Stack Overflow用户
提问于 2014-08-14 17:00:51
回答 2查看 35.8K关注 0票数 7

我正在使用go-couchbase更新数据到couchbase,但是,我在如何使用回调函数方面有问题。

函数Update要求我传递一个回调函数,该函数应为UpdateFunc

代码语言:javascript
复制
func (b *Bucket) Update(k string, exp int, callback UpdateFunc) error

这就是我所做的

首先,我声明了一个UpdateFunc类型

代码语言:javascript
复制
type UpdateFunc func(current []byte) (updated []byte, err error)

然后,在代码中添加以下几行:

代码语言:javascript
复制
fn := UpdateFunc{func(0){}} 

然后调用Update函数:

代码语言:javascript
复制
bucket.Update("12345", 0, fn()}

但Go返回以下错误:

代码语言:javascript
复制
syntax error: unexpected literal 0, expecting ) for this line fn := UpdateFunc{func(0){}}

那么我做错了什么呢?那么,如何才能使回调函数工作呢?

更多信息

谢谢你所有的建议。现在我可以运行回调函数,如下所示:

代码语言:javascript
复制
myfunc := func(current []byte)(updated []byte, err error) {return updated, err }

myb.Update("key123", 1, myfunc)

但是,当我运行存储桶的Update函数时。我查了沙发数据库。密钥为"key123“的文档消失了。看起来更新并没有更新这个值,而是删除了它。发生了什么?

EN

回答 2

Stack Overflow用户

发布于 2014-08-14 19:35:24

您需要创建一个与couchbase.UpdateFunc签名匹配的函数,然后将其传递给bucket.Update

例如:

代码语言:javascript
复制
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开始。

票数 8
EN

Stack Overflow用户

发布于 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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25304080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档