我使用的库具有多种方法的类型:
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()
}
但是接下来,我必须创建一堆样板代码,以将对method2
,method3
等的所有调用代理到Foo
实现,和< / em>我必须将Foo
的所有用法更改为Foo2
。
是否可以直接修补或包装Foo.method1()
本身而无需创建子类?
答案 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
相同的方法设置,但是method1
被Foo2
“拦截”,Foo.method1
在内部显式调用!
。