有没有办法在Go中为结构创建方法钩子?

时间:2018-03-07 06:01:42

标签: go

我想在保存之前创建,之后我的Go结构的保存方法挂钩如何实现?

    type Person struct {
        FirstName string
        LastName string
    }

    func (p *Person) Save() {
        // call beforeSave()
        // Save person data
        // call afterSave()
    }

    func (p *Person) Update() {
        // call beforeUpdate()
        // Update person data
        // call afterUpdate()
    }

    type Order struct {
        Number bson.ObjectId
        Items []Item
    }

    func (o *Order) Save() {
        // call beforeSave()
        // Save order data
        // call afterSave()
    }

    func (o *Order) Update() {
        // call beforeUpdate()
        // Update order data
        // call afterUpdate()
    }

对于我作为模型创建的任何结构,我希望它有一个自动调用的beforeSave()和afterSave()挂钩,并且能够在必要时进一步覆盖。

2 个答案:

答案 0 :(得分:0)

gorm这样的包会大量使用回调挂钩。但是如果你正在编写自己的引擎(对于某些特定的逻辑),使用接口可以帮助很大(sample)。

答案 1 :(得分:0)

https://medium.com/@matryer/the-http-handler-wrapper-technique-in-golang-updated-bc7fbcffa702

我只会在上面的文章中添加内容,我认为这很好地回答了您的问题,您可以使用管道(返回与它们绑定的关联变量的方法)做进一步的工作。如上一篇文章所述,它特别有趣,它涉及到可以在两个进程之间插入任何内容,您可以使用它来创建tee和日志记录/日志记录系统,并且它可以大大补偿原始的错误处理在Go中。

我设计了许多相关的字节片处理库,这些库可以很容易地链接而无需中断一行,尽管显然一行中超过3-4个会引起混淆,并且您会发现自己想要传递东西在DAG样式模式中,在这一点上,我认为渠道会很有意义。