Skip to content

Latest commit

 

History

History
165 lines (116 loc) · 6.06 KB

README_CN.md

File metadata and controls

165 lines (116 loc) · 6.06 KB

xreflect

Go Report Card Coverage Status Static Badge Static Badge

一个简单的, 易用的反射工具库.

主要支持如下特性:

  • 设置结构体字段值, 支持通过路径比如A.B.C设置嵌套结构体字段的值

  • 获取结构体字段的值, 类型, Tag 等.

  • 遍历结构体所有字段, 支持 select 模式和 range 模式, 如果使用深度遍历方法比如 FieldsDeep 将遍历所有嵌套结构.

  • 函数调用, 方法调用, 支持可变参数.

  • 新建实例, 判断接口实现等等.

安装和文档

安装命令 go get github.com/morrisxyang/xreflect.

文档见 https://pkg.go.dev/github.com/morrisxyang/xreflect

快速开始

设置嵌套结构体字段值

person := &Person{
	Name: "John",
	Age:  20,
	Country: Country{
		ID:   0,
		Name: "Perk",
	},
}

_ = SetEmbedField(person, "Country.ID", 1)

// Perk's ID: 1 
fmt.Printf("Perk's ID: %d \n", person.Country.ID)

获取 json tag

type Person struct {
	Name string `json:"name" xml:"_name"`
}
p := &Person{}
// json:"name" xml:"_name"
fmt.Println(StructFieldTag(p, "Name"))
// name <nil>
fmt.Println(StructFieldTagValue(p, "Name", "json"))
// _name <nil>
fmt.Println(StructFieldTagValue(p, "Name", "xml"))

筛选实例字段(深度遍历)

type Person struct {
	id   string
	Age  int    `json:"int"`
	Name string `json:"name"`
	Home struct {
		Address string `json:"address"`
	}
}

p := &Person{}
fields, _ := SelectFieldsDeep(p, func(s string, field reflect.StructField, value reflect.Value) bool {
	return field.Tag.Get("json") != ""
})
// key: Age type: int
// key: Name type: string
// key: Home.Address type: string
for k, v := range fields {
	fmt.Printf("key: %s type: %v\n", k, v.Type())
}

调用函数

var addFunc = func(nums ...int) int {
		var sum int
		for _, num := range nums {
			sum += num
		}
		return sum
}

res, _ := CallFunc(addFunc, 1, 2, 3)

// 6
fmt.Println(res[0].Interface())

核心方法

FieldX

SetX

StrcutFieldX

FuncX

Others

FAQ

FieldStrcutField 的区别是?

Field 返回 reflect.Value, StrcutField 返回 reflect.StrcutField.