diff --git a/README.md b/README.md index 257c4d0..97477f7 100644 --- a/README.md +++ b/README.md @@ -1453,29 +1453,31 @@ import "github.com/duke-git/lancet/v2/structs" #### Function list: - **New** : creates a `Struct` instance. - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/struct.md#New)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#New)] - **ToMap** : converts a valid struct to a map. - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/struct.md#ToMap)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#ToMap)] - **Fields** : get all fields of a given struct, that the fields are abstract struct field. - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/struct.md#Fields)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#Fields)] - **IsStruct** : check if the struct is valid. - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/struct.md#IsStruct)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#IsStruct)] - **Tag** : get a `Tag` of the `Field`, `Tag` is a abstract struct field tag - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/field.md#Tag)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#Tag)] - **Name** : get the field name. - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/field.md#Name)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#Name)] - **Value** : get the `Field` underlying value. - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/field.md#Value)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#Value)] - **Kind** : get the field's kind - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/field.md#Kind)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#Kind)] - **IsEmbedded** : check if the field is an embedded field. - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/field.md#IsEmbedded)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#IsEmbedded)] - **IsExported** : check if the field is exporte - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/field.md#IsExported)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#IsExported)] - **IsZero** : check if the field is zero value - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/field.md#IsZero)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#IsZero)] - **IsSlice** : check if the field is a slice - [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/structs/field.md#IsSlice)] + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#IsSlice)] +- **IsTargetType** : check if the field is target type + [[doc](https://github.com/duke-git/lancet/blob/main/docs/en/api/packages/struct.md#IsTargetType)]
判断属性是否是目标类型
+ +函数签名: + +```go +func (f *Field) IsTargetType(targetType reflect.Kind) bool +``` + +示例: + +```go +package main + +import ( + "fmt" + "reflect" + "github.com/duke-git/lancet/v2/structs" +) + +func main() { + type Parent struct { + Name string + arr []int + } + + p1 := &Parent{arr: []int{1, 2, 3}} + s := structs.New(p1) + n, _ := s.Field("Name") + a, _ := s.Field("arr") + + fmt.Println(n.IsTargetType(reflect.String)) + fmt.Println(a.IsTargetType(reflect.Slice)) + + // Output: + // true + // true +} ``` \ No newline at end of file diff --git a/docs/en/api/packages/struct.md b/docs/en/api/packages/struct.md index 4c91187..51534e9 100644 --- a/docs/en/api/packages/struct.md +++ b/docs/en/api/packages/struct.md @@ -37,6 +37,7 @@ import ( - [IsExported](#IsExported) - [IsZero](#IsZero) - [IsSlice](#IsSlice) +- [IsTargetType](#IsTargetType) @@ -533,3 +534,44 @@ func main() { // true } ``` + +### IsTargetType + +check if a struct field type is target type or not
+ +Signature: + +```go +func (f *Field) IsTargetType(targetType reflect.Kind) bool +``` + +Example: + +```go +package main + +import ( + "fmt" + "reflect" + "github.com/duke-git/lancet/v2/structs" +) + +func main() { + type Parent struct { + Name string + arr []int + } + + p1 := &Parent{arr: []int{1, 2, 3}} + s := structs.New(p1) + n, _ := s.Field("Name") + a, _ := s.Field("arr") + + fmt.Println(n.IsTargetType(reflect.String)) + fmt.Println(a.IsTargetType(reflect.Slice)) + + // Output: + // true + // true +} +``` \ No newline at end of file diff --git a/structs/field.go b/structs/field.go index 893c5fa..5815b12 100644 --- a/structs/field.go +++ b/structs/field.go @@ -68,6 +68,11 @@ func (f *Field) IsSlice() bool { return k == reflect.Slice } +// IsTargetType check if a struct field type is target type or not +func (f *Field) IsTargetType(targetType reflect.Kind) bool { + return f.rvalue.Kind() == targetType +} + // mapValue covert field value to map func (f *Field) mapValue(value any) any { val := pointer.ExtractPointer(value) diff --git a/structs/field_test.go b/structs/field_test.go index 6e2c0fe..29fe27d 100644 --- a/structs/field_test.go +++ b/structs/field_test.go @@ -154,6 +154,25 @@ func TestField_IsSlice(t *testing.T) { assert.Equal(true, a.IsSlice()) } +func TestField_IsTargetType(t *testing.T) { + t.Parallel() + + assert := internal.NewAssert(t, "TestField_IsTargetType") + + type Parent struct { + Name string + arr []int + } + + p1 := &Parent{Name: "test", arr: []int{1, 2, 3}} + s := New(p1) + n, _ := s.Field("Name") + a, _ := s.Field("arr") + + assert.Equal(true, n.IsTargetType(reflect.String)) + assert.Equal(true, a.IsTargetType(reflect.Slice)) +} + func TestField_MapValue(t *testing.T) { t.Parallel()