Значения структуры сравнимы, если все их поля сравнимы (см. 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}
}
Вам не нужно перечислять поля, значения которых являются нулевыми значениями их типов.