Состав структуры Golang - составленный со структурой, не может получить доступ к своему «родителю» - PullRequest
0 голосов
/ 02 октября 2018

Этот вопрос кажется дубликатом Могут ли встроенные методы получить доступ к "родительским" полям? , но я не знаю, что нет никакого способа получить доступ к "родительским" полям;Я просто ищу предложения по другому способу сделать это, потому что мне нравится идея Pausable структуры.


Я пытаюсь создать удобную структуру, которая позволяет другим структурам получать некоторую паузу/ неиспользуемые методы.

Представьте себе следующее:

Pausable struct

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
}

Проблема

Проблема становится такой.Я хочу добавить метод PauseUntil() в структуру Pausable, чтобы он стал

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.Что было бы умным способом обойти это?

1 Ответ

0 голосов
/ 02 октября 2018

Вы можете сделать PauseUntil функцией, которая работает на интерфейсе Pauser.

Например,

type Pauser interface {
    Pause()
    Unpause()
}

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

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

Тогда вы сможете передать myStruct этой функции:

ms := new(myStruct)
PauseUntil(ms)
...