История изменений
Исправление beastie, (текущая версия) :
Любой каприз за ваши деньги. ;)
package main
import (
"fmt"
"reflect"
)
func HasField(v interface{}, name string) bool {
return hasField(reflect.ValueOf(v), name)
}
func hasField(v reflect.Value, name string) bool {
switch v.Type().Kind() {
case reflect.Ptr:
return hasField(v.Elem(), name)
case reflect.Struct:
_, ok := v.Type().FieldByName(name)
return ok
}
return false
}
func main() {
type Employee struct {
ID int
Name string
Address string
some int
}
x := Employee{
Name: "Vasya",
}
fmt.Println(HasField(x, "some")) // true
fmt.Println(HasField(x, "someOther")) // false
}
Но учти! reflect is a path to the dark side.
Серьёзно, не надо так делать. Никогда. Но если очень хочется, то можно конечно. Но всё же лучше не надо.
Исходная версия beastie, :
Любой каприз за ваши деньги. ;)
package main
import (
"fmt"
"reflect"
)
func HasField(v interface{}, name string) bool {
return hasFiled(reflect.ValueOf(v), name)
}
func hasFiled(v reflect.Value, name string) bool {
switch v.Type().Kind() {
case reflect.Ptr:
return hasFiled(v.Elem(), name)
case reflect.Struct:
_, ok := v.Type().FieldByName(name)
return ok
}
return false
}
func main() {
type Employee struct {
ID int
Name string
Address string
some int
}
x := Employee{
Name: "Vasya",
}
fmt.Println(HasField(x, "some")) // true
fmt.Println(HasField(x, "someOther")) // false
}
Но учти! reflect is a path to the dark side.
Серьёзно, не надо так делать. Никогда. Но если очень хочется, то можно конечно. Но всё же лучше не надо.