backend
This commit is contained in:
82
utils/collect/collect.go
Normal file
82
utils/collect/collect.go
Normal file
@@ -0,0 +1,82 @@
|
||||
package collect
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
func ArrayColumn[R any, T any](arr []T, column string) []R {
|
||||
var result []R
|
||||
s := reflect.ValueOf(arr)
|
||||
|
||||
for i := 0; i < s.Len(); i++ {
|
||||
e := s.Index(i)
|
||||
k := e.FieldByName(column)
|
||||
result = append(result, k.Interface().(R))
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func ArrayIndex[T any](arr []T, index int) (result T, ok bool) {
|
||||
if index < len(arr) {
|
||||
result = arr[index]
|
||||
ok = true
|
||||
return
|
||||
}
|
||||
ok = false
|
||||
return
|
||||
}
|
||||
|
||||
func ArrayString2Int(arr interface{}) (result []int64) {
|
||||
for _, a := range arr.([]string) {
|
||||
v, err := strconv.ParseInt(a, 10, 64)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
result = append(result, v)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func Array2MapByKey[KEY comparable, VALUE any](arrSrc []VALUE, fieldName string) (result map[KEY]VALUE) {
|
||||
result = make(map[KEY]VALUE)
|
||||
arr := reflect.ValueOf(arrSrc)
|
||||
|
||||
for i := 0; i < arr.Len(); i++ {
|
||||
srcv := arr.Index(i)
|
||||
fv := srcv.Elem().FieldByName(fieldName)
|
||||
k := fv.Interface().(KEY)
|
||||
result[k] = srcv.Interface().(VALUE)
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func Array2MapByKeyTag[KEY comparable, VALUE any](arrSrc []VALUE, tag string) (result map[KEY]VALUE) {
|
||||
|
||||
arr := reflect.ValueOf(arrSrc)
|
||||
|
||||
if arr.Len() == 0 {
|
||||
return result
|
||||
}
|
||||
result = make(map[KEY]VALUE)
|
||||
|
||||
eleType := arr.Index(0).Elem().Type()
|
||||
|
||||
for j := 0; j < eleType.NumField(); j++ {
|
||||
if value, ok := eleType.Field(j).Tag.Lookup("json"); ok && value == tag {
|
||||
|
||||
for i := 0; i < arr.Len(); i++ {
|
||||
srcv := arr.Index(i)
|
||||
fv := srcv.Elem().Field(j)
|
||||
k := fv.Interface().(KEY)
|
||||
result[k] = srcv.Interface().(VALUE)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
32
utils/collect/collect_test.go
Normal file
32
utils/collect/collect_test.go
Normal file
@@ -0,0 +1,32 @@
|
||||
package collect
|
||||
|
||||
import (
|
||||
"log"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type ABC struct {
|
||||
A int64 `json:"a"`
|
||||
B string `json:"b"`
|
||||
C interface{} `json:"c"`
|
||||
}
|
||||
|
||||
func TestArray2MapByKey(t *testing.T) {
|
||||
var abcs []*ABC = []*ABC{
|
||||
{1, "2", 3},
|
||||
{3, "1", 2},
|
||||
}
|
||||
a := Array2MapByKey[string](abcs, "B")
|
||||
log.Printf("%##v", a)
|
||||
log.Println(len(a))
|
||||
}
|
||||
|
||||
func TestArray2MapByKeyTag(t *testing.T) {
|
||||
var abcs []*ABC = []*ABC{
|
||||
{1, "2", 3},
|
||||
{3, "1", 2},
|
||||
}
|
||||
a := Array2MapByKeyTag[int64](abcs, "a")
|
||||
log.Printf("%##v", a)
|
||||
log.Println(len(a))
|
||||
}
|
||||
Reference in New Issue
Block a user