首先, 使用 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)
}
}