一个通用的golang装饰器(要点需要澄清)

时间:2017-07-30 02:40:41

标签: go decorator

有人可以解释这个要点中发生了什么吗?我理解装饰器的概念以及这个实现如何让人们创建一个通用的装饰器,但我在几个部分(内联注释)中很少丢失。如果有人能为我分解,我真的很感激。 如果这不是编写通用装饰器的最佳方法,那么它是什么?我正在寻找一个可以装饰类型为func(args ... interface {})(interface {},error)的函数的装饰器,而不会丢弃类型安全。

https://gist.github.com/saelo/4190b75724adc06b1c5a

package main

import (
    "fmt"
    "reflect"
)

func Decorate(impl interface{}) interface{} {
        fn := reflect.ValueOf(impl)
        //What does inner do ? What is this codeblock ?
        inner := func(in []reflect.Value) []reflect.Value { //Why does this return the same type as the parameters passed to the function ? Does this mean this decorator only works for fns with signature func (arg TypeA) TypeA and not func (arg TypeA) TypeB ?
            f := reflect.ValueOf(impl)

            fmt.Println("Stuff before")
            // ...

            ret := f.Call(in) //What does call do ? Why cant we just use f(in) ?

            fmt.Println("Stuff after")
            // ...

            return ret
        }

        v := reflect.MakeFunc(fn.Type(), inner)

        return v.Interface()
}

var Add = Decorate(
    func (a, b int) int {
        return a + b
    },
).(func(a, b int) int) //Is this a type assertion ?



func main() {
    fmt.Println(Add(1, 2))
}

1 个答案:

答案 0 :(得分:1)

使用short variable declaration声明变量inner。变量inner的类型为func(in []reflect.Value) []reflect.Value。该值是代码中的函数文字。

类型func(in []reflect.Value) []reflect.Value表示由反射实现的泛型函数。该函数采用可能为空的参数片段并返回可能为空的结果片段。

函数的reflect.Value不能直接调用。 Call方法用于调用值中的函数。

.(func(a, b int) int)是一种类型断言。