LINUX.ORG.RU

История изменений

Исправление 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.

Серьёзно, не надо так делать. Никогда. Но если очень хочется, то можно конечно. Но всё же лучше не надо.