Как изменить поле в структуре неизвестного типа? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть несколько структур, которые имеют одно общее поле;давайте назовем это common здесь

type Struct1 struct {
    foo string
    bar string

    common string
}

type Struct2 struct {
    baz int
    qux string

    common string
}

Я хочу создать функцию, которая принимает Interface в качестве ввода и обнуляет common.Доступные типы структуры не будут известны во время компиляции, поэтому я не могу создать отдельную функцию для каждого типа и не могу использовать оператор switch.

PS: В моем случае использованияЯ хочу обнулить common, потому что он содержит время создания каждой структуры, и я хочу отслеживать историю структуры, поэтому я буду знать, если она изменится.Наличие времени создания внутри структуры испортит это, потому что время создания будет отличаться каждый раз, когда генерируется новая структура, даже если ее фактические данные могут быть одинаковыми.

1 Ответ

0 голосов
/ 20 сентября 2018

Определите структуру с общими полями и заставьте ее реализовать интерфейс, который говорит, что она может обнулять общие поля.Затем вставьте эту структуру в ваши другие типы структур, которые должны иметь возможность обнулять поля.

// CommonNullifier is able to nullify its common field(s)
type CommonNullifier interface {
        NullifyCommon()
}

// StructCommon contains the common struct fields
type StructCommon struct {
        Common string
}

func (sc *StructCommon) NullifyCommon() {
        sc.Common = ""
}

// Struct1 embeds common fields, thus implements CommonNullifier
type Struct1 struct {
        StructCommon
        Foo string
}

// Struct2 also embeds common fields, thus also implements CommonNullifier
type Struct2 struct {
        StructCommon
        Bar string
}

// NullifyCommon nullfies the 'common' fields in the argument
func NullifyCommon(s CommonNullifier) {
        s.NullifyCommon()
}

(см. На Go Playground )

Вы также можетеиспользуйте отражение , но использование интерфейса обычно более читабельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...