Skip to content

Latest commit

 

History

History
577 lines (417 loc) · 8.25 KB

struct.md

File metadata and controls

577 lines (417 loc) · 8.25 KB

Structs

Struct is abstract struct for provide several high level functions

Source:

Usage:

import (
    "github.com/duke-git/lancet/v2/structs"
)

Index:

Documentation:

New

The constructor function of the `Struct`

Signature:

func New(value any, tagName ...string) *Struct

Example:

package main

import (
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type People struct {
        Name string `json:"name"`
    }
    p1 := &People{Name: "11"}
    s := structs.New(p1)
    // to do something
}

ToMap

convert a valid struct to a map

Signature:

func (s *Struct) ToMap() (map[string]any, error)

In addition, provided a convenient static function ToMap

func ToMap(v any) (map[string]any, error)

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type People struct {
        Name string `json:"name"`
    }
    p1 := &People{Name: "11"}
    // use constructor function
    s1 := structs.New(p1)
    m1, _ := s1.ToMap()

    fmt.Println(m1)

    // use static function
    m2, _ := structs.ToMap(p1)

    fmt.Println(m2)

    // Output:
    // map[name:11]
    // map[name:11]
}

Fields

Get all fields of a given struct, that the fields are abstract struct field

Signature:

func (s *Struct) Fields() []*Field

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type People struct {
        Name string `json:"name"`
    }
    p1 := &People{Name: "11"}
    s := structs.New(p1)
    fields := s.Fields()

    fmt.Println(len(fields))

    // Output:
    // 1
}

Field

Get an abstract field of a struct by given field name

Signature:

func (s *Struct) Field(name string) *Field

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type People struct {
        Name string `json:"name"`
    }
    p1 := &People{Name: "11"}
    s := structs.New(p1)
    f := s.Field("Name")

    fmt.Println(f.Value())

    // Output:
    // 11
}

IsStruct

Check if the struct is valid

Signature:

func (s *Struct) IsStruct() bool

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type People struct {
        Name string `json:"name"`
    }
    p1 := &People{Name: "11"}
    s := structs.New(p1)

    fmt.Println(s.IsStruct())

    // Output:
    // true
}

Tag

Get a `Tag` of the `Field`, `Tag` is a abstract struct field tag

Signature:

func (f *Field) Tag() *Tag

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type Parent struct {
        Name string `json:"name,omitempty"`
    }
    p1 := &Parent{"111"}

    s := structs.New(p1)
    n, _ := s.Field("Name")
    tag := n.Tag()

    fmt.Println(tag.Name)

    // Output:
    // name
}

Value

Get the `Field` underlying value

Signature:

func (f *Field) Value() any

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type Parent struct {
        Name string `json:"name,omitempty"`
    }
    p1 := &Parent{"111"}

    s := structs.New(p1)
    n, _ := s.Field("Name")

    fmt.Println(n.Value())

    // Output:
    // 111
}

IsEmbedded

Check if the field is an embedded field

Signature:

func (f *Field) IsEmbedded() bool

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type Parent struct {
        Name string
    }
    type Child struct {
        Parent
        Age int
    }
    c1 := &Child{}
    c1.Name = "111"
    c1.Age = 11

    s := structs.New(c1)
    n, _ := s.Field("Name")
    a, _ := s.Field("Age")

    fmt.Println(n.IsEmbedded())
    fmt.Println(a.IsEmbedded())

    // Output:
    // true
    // false
}

IsExported

Check if the field is exported

Signature:

func (f *Field) IsExported() bool

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type Parent struct {
        Name string
        age  int
    }
    p1 := &Parent{Name: "11", age: 11}
    s := structs.New(p1)
    n, _ := s.Field("Name")
    a, _ := s.Field("age")

    fmt.Println(n.IsExported())
    fmt.Println(a.IsExported())

    // Output:
    // true
    // false
}

IsZero

Check if the field is zero value

Signature:

func (f *Field) IsZero() bool

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type Parent struct {
        Name string
        Age  int
    }
    p1 := &Parent{Age: 11}
    s := structs.New(p1)
    n, _ := s.Field("Name")
    a, _ := s.Field("Age")

    fmt.Println(n.IsZero())
    fmt.Println(a.IsZero())

    // Output:
    // true
    // false
}

Name

Get the field name

Signature:

func (f *Field) Name() string

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type Parent struct {
        Name string
        Age  int
    }
    p1 := &Parent{Age: 11}
    s := structs.New(p1)
    n, _ := s.Field("Name")
    a, _ := s.Field("Age")

    fmt.Println(n.Name())
    fmt.Println(a.Name())

    // Output:
    // Name
    // Age
}

Kind

Get the field's kind

Signature:

func (f *Field) Kind() reflect.Kind

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/structs"
)

func main() {
    type Parent struct {
        Name string
        Age  int
    }
    p1 := &Parent{Age: 11}
    s := structs.New(p1)
    n, _ := s.Field("Name")
    a, _ := s.Field("Age")

    fmt.Println(n.Kind())
    fmt.Println(a.Kind())

    // Output:
    // string
    // int
}

IsSlice

Check if the field is a slice

Signature:

func (f *Field) IsSlice() bool

Example:

package main

import (
    "fmt"
    "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)
    a, _ := s.Field("arr")

    fmt.Println(a.IsSlice())

    // Output:
    // true
}

IsTargetType

check if a struct field type is target type or not

Signature:

func (f *Field) IsTargetType(targetType reflect.Kind) bool

Example:

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
}