gpt4 book ai didi

Golang 结构组合 - 用结构组合无法访问其 "parent"

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:37 25 4
gpt4 key购买 nike

这个问题似乎与 Can embedded methods access "parent" fields? 重复,但在我知道没有办法访问“父”字段的意义上并不是这样;我只是在寻找关于另一种方法的建议,因为我喜欢 Pausable 结构的想法。


我正在尝试制作一个方便的结构,使其他结构能够接收一些暂停/取消暂停方法。

想象一下:

可暂停结构

type Pausable struct {
isPaused bool
}

func (p *Pausable) Pause() {
p.isPaused = true
}

func (p *Pausable) Unpause() {
p.isPaused = false
}

与 Pausable 组合的结构体

现在在我的其他结构上,我想覆盖 Unpause() 方法,这样除了更改 p.isPaused 的值之外,还会发生一些其他事情。

type Mystruct struct {
Pausable // Composition
}

func (s *Mystruct) Unpause() {
s.Unpause()

// Do other stuff
}

问题

问题就变成这样了。我想在 Pausable 结构中添加一个 PauseUntil() 方法,这样它就变成了

type Pausable struct {
isPaused bool
}

func (p *Pausable) Pause() {
p.isPaused = true
}

func (p *Pausable) Unpause() {
p.isPaused = false
}

func (p *Pausable) PauseUntil(dur time.Duration) {
p.Pause()

go func() {
time.Sleep(dur)
p.Unpause()
}()
}

但是,当超时用完时,Unpause() 将在 Pausable 上调用,而不是在 Mystruct 上调用。有什么聪明的方法可以解决这个问题?

最佳答案

您可以使 PauseUntil 成为在 Pauser 接口(interface)上运行的函数。

例如

type Pauser interface {
Pause()
Unpause()
}

func PauseUntil(p Pauser) {
p.Pause()

go func() {
time.Sleep(dur)
p.Unpause()
}()
}

然后您应该能够将您的 myStruct 传递给该函数:

ms := new(myStruct)
PauseUntil(ms)

关于Golang 结构组合 - 用结构组合无法访问其 "parent",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52604895/

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