1 Star 0 Fork 0

csingo/cHelper

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
Struct.go 2.51 KB
一键复制 编辑 原始数据 按行查看 历史
chenxuyi 提交于 2023-01-11 10:34 . update
package cHelper
import (
"reflect"
"strings"
)
func fieldValues(field string, data []interface{}) []interface{} {
result := []interface{}{}
for _, dataItem := range data {
if field == "*" {
if !IsSlice(dataItem) {
result = append(result, nil)
} else {
value := reflect.ValueOf(dataItem)
len := value.Len()
for i := 0; i < len; i++ {
item := value.Index(i)
if item.CanInterface() {
result = append(result, item.Interface())
} else {
result = append(result, nil)
}
}
}
} else if IsStruct(dataItem) {
dataItemType := reflect.TypeOf(dataItem).Elem()
dataItemValue := reflect.ValueOf(dataItem).Elem()
len := dataItemType.NumField()
match := false
for i := 0; i < len; i++ {
dataItemFieldName := dataItemType.Field(i).Name
if dataItemFieldName != field {
continue
}
match = true
dataItemFieldValue := dataItemValue.FieldByName(dataItemFieldName)
if dataItemFieldValue.CanInterface() {
result = append(result, dataItemFieldValue.Interface())
} else {
result = append(result, nil)
}
break
}
if !match {
result = append(result, nil)
}
} else if IsMap(dataItem) {
dataItemValue := reflect.ValueOf(dataItem)
i := dataItemValue.MapRange()
match := false
for i.Next() {
if i.Key().String() != field {
continue
}
match = true
dataItemFieldValue := i.Value()
if dataItemFieldValue.CanInterface() {
result = append(result, dataItemFieldValue.Interface())
} else {
result = append(result, nil)
}
}
if !match {
result = append(result, nil)
}
} else {
result = append(result, nil)
}
}
return result
}
func GetFieldValues(field string, data interface{}) []interface{} {
fields := strings.Split(field, ".")
fieldsData := [][]interface{}{}
fieldsData = append(fieldsData, []interface{}{data})
for index, fieldItem := range fields {
tempData := fieldValues(fieldItem, fieldsData[index])
fieldsData = append(fieldsData, tempData)
}
return fieldsData[len(fields)]
}
func GetFieldValue(field string, data interface{}) interface{} {
fields := strings.Split(field, ".")
fieldsData := [][]interface{}{}
fieldsData = append(fieldsData, []interface{}{data})
for index, fieldItem := range fields {
tempData := fieldValues(fieldItem, fieldsData[index])
fieldsData = append(fieldsData, tempData)
}
result := fieldsData[len(fields)]
if InArray(fields, "*") {
return result
} else if len(result) > 0 {
return result[0]
} else {
return nil
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/csingo/cHelper.git
git@gitee.com:csingo/cHelper.git
csingo
cHelper
cHelper
v0.1.13

搜索帮助