gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:38:09 25 4
gpt4 key购买 nike

我使用的一个库有一个包含多种方法的类型:

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()
}

但这添加了一个方法,我必须调用而不是直接调用method1() 本身。

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

type Foo2 struct {
Foo
}

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

但随后我必须创建一堆样板代码来代理所有对 method2method3 等的调用到 Foo 实现, 我必须将 Foo 的所有用法更改为 Foo2。 😩

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

最佳答案

您不需要代理方法调用来委托(delegate)它们,这正是 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()
}

Foo2Foo 具有相同的方法集,但 method1Foo2“拦截”,这在内部显式调用 Foo.method1

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

关于go - 在类型结构上包装许多方法之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51109957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com