можно узнать, было ли назначено поле с отражением в golang? - PullRequest
0 голосов
/ 16 октября 2018

У меня есть структура, как показано ниже:

type Demo struct{
     A string
     B string
}

, и у меня есть экземпляр этого, как показано ниже:

demo := Demo{A:"a"}

поле A былоназначенное значение явно, но поле B нет.Теперь я хочу знать, существует ли какой-то метод, которым я могу получить поле Экземпляра A , которому было присвоено значение через отражение ?

Здесь я хочу получить поле A .

1 Ответ

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

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

Зацикливание полей.Верните true, если значение поля не равно нулевому значению для типа поля.

func hasNonZeroField(s interface{}) bool {
    v := reflect.ValueOf(s)
    if v.Kind() == reflect.Ptr {
        v = v.Elem()
    }
    t := v.Type()
    for i := 0; i < t.NumField(); i++ {
        sf := t.Field(i)
        fv := v.Field(i)
        switch sf.Type.Kind() {
        case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
            if !fv.IsNil() {
                return true
            }
        case reflect.Struct:
            if hasNonZeroField(fv.Interface()) {
                return true
            }
        // case reflect.Array:
        // TODO: call recursively for array elements
        default:
            if reflect.Zero(sf.Type).Interface() != fv.Interface() {
                return true
            }
        }
    }
    return false
}

Запустите его на игровой площадке .

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