1 Star 0 Fork 0

miajio / go-util

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
struct_util.go 2.74 KB
一键复制 编辑 原始数据 按行查看 历史
xiaoby 提交于 2021-11-30 17:04 . 优化去重方法、新增过滤方法
package read
import (
"fmt"
"reflect"
)
// ReadHaveValueTag 读标签 获取val结构体参数数据
// 仅返回数据非空的字段数据及对应字段结构
func ReadHaveValueTag(val interface{}, tag string) ([]string, []interface{}) {
columns := make([]string, 0)
params := make([]interface{}, 0)
typeOf := reflect.TypeOf(val)
valueOf := reflect.ValueOf(val)
for i := 0; i < typeOf.NumField(); i++ {
column := typeOf.Field(i).Tag.Get(tag)
value := valueOf.Field(i).Interface()
if !ValueIsBlank(reflect.ValueOf(value)) {
columns = append(columns, column)
params = append(params, value)
}
}
return columns, params
}
// ReadAllTag 读标签 获取val结构体参数数据
// 返回所有的字段数据及对应字段结构
func ReadAllTag(val interface{}, tag string) ([]string, []interface{}) {
columns := make([]string, 0)
params := make([]interface{}, 0)
typeOf := reflect.TypeOf(val)
valueOf := reflect.ValueOf(val)
for i := 0; i < typeOf.NumField(); i++ {
column := typeOf.Field(i).Tag.Get(tag)
value := valueOf.Field(i).Interface()
if column != "" {
columns = append(columns, column)
if !ValueIsBlank(reflect.ValueOf(value)) {
params = append(params, value)
} else {
params = append(params, nil)
}
}
}
return columns, params
}
// ValueIsBlank reflect.Value结构体方法封装
// 判断当前结构参数数据是否为空
func ValueIsBlank(value reflect.Value) bool {
switch value.Kind() {
case reflect.String:
return value.Len() == 0
case reflect.Bool:
return !value.Bool()
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return value.Int() == 0
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return value.Uint() == 0
case reflect.Float32, reflect.Float64:
return value.Float() == 0
case reflect.Interface, reflect.Ptr:
return value.IsNil()
}
return reflect.DeepEqual(value.Interface(), reflect.Zero(value.Type()).Interface())
}
// IsZero 判断当前结果为零值
func IsZero(val interface{}) bool {
return nil == val || reflect.Zero(reflect.TypeOf(val)) == val
}
// TypeEquals 判断两个结果类型是否一致
func TypeEquals(vals ...interface{}) bool {
for i := range vals {
if i > 0 && reflect.TypeOf(vals[i-1]) != reflect.TypeOf(vals[i]) {
return false
}
}
return true
}
// InterfaceToSlice slice interface转interface[]
func InterfaceToSlice(slice interface{}) ([]interface{}, error) {
result := make([]interface{}, 0)
switch reflect.TypeOf(slice).Kind() {
case reflect.Slice, reflect.Array:
vals := reflect.ValueOf(slice)
for i := 0; i < vals.Len(); i++ {
result = append(result, vals.Index(i).Interface())
}
default:
return nil, fmt.Errorf("slice type error")
}
return result, nil
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/miajio/go-util.git
git@gitee.com:miajio/go-util.git
miajio
go-util
go-util
v1.0.3

搜索帮助

344bd9b3 5694891 D2dac590 5694891