Для начала, вы добавляете val
к срезу values
, если val
IS нулевое значение, а не если это не так.Так что вам стоит проверить if !reflect.DeepEqual(...
вместо того, что вы имеетеКроме этого, ваш код работает нормально:
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string
Age int
Email string
}
func main() {
user, values := User{Name: "Bob", Age: 32}, []interface{}(nil)
structIterator := reflect.ValueOf(user)
for i := 0; i < structIterator.NumField(); i++ {
field := structIterator.Type().Field(i).Name
val := structIterator.Field(i).Interface()
// Check if the field is zero-valued, meaning it won't be updated
if !reflect.DeepEqual(val, reflect.Zero(structIterator.Field(i).Type()).Interface()) {
fmt.Printf("%v is non-zero, adding to update\n", field)
values = append(values, val)
}
}
}
выводит следующее ( Go Playground Link ):
Name is non-zero, adding to update
Age is non-zero, adding to update
Так что это правильно,поле Email
не инициализировано (или, вернее, содержит нулевое значение для string
).