在类型结构上包装许多方法之一?

时间:2018-06-29 22:04:54

标签: go

我使用的库具有多种方法的类型:

type Foo struct {
}

func (f *Foo) method1() int { ... }
func (f *Foo) method2() int { ... }
func (f *Foo) method3() int { ... }
// ... and so on

我真的很想在我为此类型致电method1时应用一些特定的行为:

func (f *Foo) method1Wrapper() int {
    incrementCounter()
    return f.method1()
}

但这会添加一个 new 方法,我不得不直接调用method1()本身来调用

或者,我想我可以创建自己的类型:

type Foo2 struct {
    Foo
}

func (f *Foo2) method1() int {
    incrementCounter()
    return f.Foo.method1()
}

但是接下来,我必须创建一堆样板代码,以将对method2method3等的所有调用代理到Foo实现,和< / em>我必须将Foo的所有用法更改为Foo2

是否可以直接修补或包装Foo.method1()本身而无需创建子类?

1 个答案:

答案 0 :(得分:3)

您无需代理方法调用即可委派它们,这正是embedding的目的。

type Foo struct {
}

func (f *Foo) method1() int { return 1 }
func (f *Foo) method2() int { return 2 }
func (f *Foo) method3() int { return 3 }

type Foo2 struct {
    *Foo
}

func (f Foo2) method1() int {
    fmt.Println("WRAPPED")
    return f.Foo.method1()
}

Foo2具有与Foo相同的方法设置,但是method1Foo2“拦截”,Foo.method1在内部显式调用!

https://play.golang.org/p/q8tea5ZuHl4