首先, 使用 reflect.ValueOf 先获取值, 然后使用 .Elem() 获取对象。再之后就可以通过属性的名称通过反射来获取值了。示例:


type Human interface {
	Name() string
	Type() string
}

type Martian struct {
	name string
	id   int
}

func (m *Martian) Name() string {
	return m.name
}

func (m *Martian) Type() string {
	return "martian"
}

func TestHuman(t *testing.T) {
	var human Human

	human = &Martian{
		name: "Jack",
		id:   1,
	}

	t.Log(human.Name())

	// convert interface{} to map[string]interface{}
	data := map[string]interface{}{}
	obj := reflect.ValueOf(human)

	elem := obj.Elem()

	if elem.Kind() == reflect.Struct {
		id := elem.FieldByName("id")
		if id.Kind() == reflect.Int {
			data["id"] = id.Int()
		}

		name := elem.FieldByName("name")
		if name.Kind() == reflect.String {
			data["name"] = name.String()
		}
		t.Log(data)
	}
}