Проверьте, не изменился ли каждый элемент в структуре - PullRequest
0 голосов
/ 19 мая 2018

У меня есть следующий пакет:

// Contains state read in from the command line
type State struct {
    Domain          string  // Domain to check for
    DomainList      string  // File location for a list of domains
    OutputNormal    string  // File to output in normal format
    OutputDomains   string  // File to output domains only to
    Verbose         bool    // Verbose prints, incl. Debug information
    Threads         int     // Number of threads to use
    NoColour        bool    // Strip colour from output
    Silent          bool    // Output domains only
    Usage           bool    // Print usage information
}

func InitState() (state State) {
    return State { "", "", "", "", false, 20, false, false, false }
}

func ValidateState(s *State) (result bool, error string ) {
    if s.Domain == "" && s.DomainList == "" {
        return false, "You must specify either a domain or list of domains to test"
    }

    return true, ""
}

В пределах ValidateState() Я хотел бы вернуть true, если каждый элемент в State совпадает с тем, что определено в InitState().Я вижу несколько способов сделать это, но ничего, что кажется кратким.Я бы очень ценил какое-то направление!

1 Ответ

0 голосов
/ 19 мая 2018

Значения структуры сравнимы, если все их поля сравнимы (см. Spec: Операторы сравнения ).И поскольку в вашем случае это верно, мы можем воспользоваться этим.

В вашем случае самый простой и эффективный способ добиться этого - сохранить значение структуры, содержащее начальное значение, и всякий раз, когда вы хотите сообщитьесли значение структуры (если есть какие-либо из ее полей) изменилось, просто сравните его с сохраненным начальным значением.Это все, что нужно:

var defaultState = InitState()

func isUnchanged(s State) bool {
    return s == defaultState
}

Тестирование:

s := InitState()
fmt.Println(isUnchanged(s))

s.Threads = 1
fmt.Println(isUnchanged(s))

Вывод (попробуйте на Go Playground ):

true
false

Обратите внимание, что это решение будет по-прежнему работать без каких-либо изменений, если вы измените тип State, добавив / удалив / переименовав / переставив поля, если они все будут сопоставимы.Например, если вы добавите поле типа среза, оно больше не будет работать, так как срезы несопоставимы.Это приведет к ошибке во время компиляции.Для обработки таких случаев можно использовать reflect.DeepEqual() вместо простого оператора сравнения ==.

Также обратите внимание, что вы должны создать значения по умолчанию State, например:

func NewState() State {
    return State{Threads: 20}
}

Вам не нужно перечислять поля, значения которых являются нулевыми значениями их типов.

...