minitauros
minitauros

Reputation: 2030

Golang struct composition - composed with struct cannot access its "parent"

This question appears to be a duplicate of Can embedded methods access "parent" fields?, but it is not in the sense that I know that there is no way to access the "parent" fields; I am just looking for suggestions on another way to do this, because I like the idea of the Pausable struct.


I am trying to make a convenience struct that enables other structs to receive some pausing/unpausing methods.

Imagine the following:

Pausable struct

type Pausable struct {
    isPaused bool
}

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

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

Struct that composes with Pausable

Now on my other struct I want to overwrite the Unpause() method, so that besides changing the value of p.isPaused some other stuff happens as well.

type Mystruct struct {
    Pausable // Composition
}

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

    // Do other stuff
}

Problem

The problem becomes this. I want to add an PauseUntil() method to the Pausable struct, so that it becomes

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

When the timeout runs out, however, Unpause() is called on Pausable, and not on Mystruct. What would be a clever way around this?

Upvotes: 1

Views: 979

Answers (1)

Peter Stace
Peter Stace

Reputation: 1434

You could make PauseUntil a function that operates on a Pauser interface.

E.g.

type Pauser interface {
    Pause()
    Unpause()
}

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

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

Then you should be able to pass your myStruct to that function:

ms := new(myStruct)
PauseUntil(ms)

Upvotes: 2

Related Questions