go中常用自建工具函数
(1)CheckValueNotEmpty
说明:检测结构体、map中,指定的key的值是否为空
// 检测结构体/map中指定参数不能为空
func CheckValueNotEmpty(obj interface{}, fields []string) (bool, error) {
objValue := reflect.ValueOf(obj)
switch reflect.ValueOf(obj).Kind() {
case reflect.Struct:
for _, field := range fields {
value := objValue.FieldByName(field)
if false == value.IsValid() || value.Interface() == "" {
msg := field + ",不能为空"
err := errors.New(msg)
return false, err
}
}
case reflect.Map:
for _, field := range fields {
value := objValue.MapIndex(reflect.ValueOf(field))
if false == value.IsValid() || value.Interface() == "" {
msg := field + ",不能为空"
err := errors.New(msg)
return false, err
}
}
}
return true, nil
}
使用案例:
fields := []string{"Age", "Sex", "Weight" , "Height"}
// 结构体使用
type Test2 struct {
Age int `json:"age"`
Sex string `json:"sex"`
Height string `json:"height"`
Weight string `json:"weight"`
}
data := Test2{
Sex: "女",
Weight: "11.2",
}
// map使用
//data := map[string]string{"Sex": "男", "Weight": "112"}
// 方法调用
_, err := CheckValueNotEmpty(data, fields)
if err != nil {
fmt.Println(err)
}
(2)IsDataExist
判断某个元素是否在slice,array,map中
// 判断某个元素是否在slice,array,map中
func IsDataExist(target interface{}, obj interface{}) (bool, error) {
targetValue := reflect.ValueOf(target)
switch reflect.TypeOf(target).Kind() {
case reflect.Slice, reflect.Array:
for i := 0; i < targetValue.Len(); i++ {
if targetValue.Index(i).Interface() == obj {
return true, nil
}
}
case reflect.Map:
if targetValue.MapIndex(reflect.ValueOf(obj)).IsValid() {
return true, nil
}
}
return false, errors.New("not in")
}
// 使用案例:
// slice使用
//data := []string{"Sex", "Weight"}
// 数组使用
data := [2]string{"Sex", "Weight"}
// map使用
//data := map[string]string{"Sex": "男", "Weight": "112"}
res, err := IsDataExist(data, "Sex")
fmt.Println(res,err)
(3)StructToMap
结构体转map
// 结构体转map
func StructToMap(obj interface{}) map[string]interface{}{
objField := reflect.TypeOf(obj)
objValue := reflect.ValueOf(obj)
var data = make(map[string]interface{})
for i := 0; i < objField.NumField(); i++ {
data[objField.Field(i).Name] = objValue.Field(i).Interface()
}
return data
}
// 使用案例:
type Test2 struct {
Age int `json:"age"`
Sex string `json:"sex"`
Height string `json:"height"`
Weight string `json:"weight"`
}
student := Test2{10, "男", "111", "111"}
data := StructToMap(student)
fmt.Println(data)
(4)IsFileExists
判断文件是否存在
// 判断文件或文件夹是否存在
func IsFileExists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
(5)CreateFile
创建文件或文件夹 依赖方法(4)
// 创建文件或文件夹
func CreateFile(path string) (bool, error) {
// 判断文件是否存在
if isExists, _ := IsFileExists(path); !isExists {
// 拆分文件名
dirPath := path
subSite := strings.LastIndex(path,".")
if subSite > 0 {
dirSite := strings.LastIndex(path, "/")
dirPath = path[0 : dirSite]
}
if isPathExist , _:= IsFileExists(dirPath); !isPathExist {
err := os.MkdirAll(dirPath, os.ModePerm)
if err != nil {
return false, err
}
}
// 创建文件
f,err := os.Create(path)
defer f.Close()
if err != nil {
return false, err
}
}
return true, nil
}
(6)CountAge
计算年龄,如果不设置计算截止时间,则用系统当前时间
// 计算年龄 birthDay:1992-09-12 countDay:2020-09-21
func CountAge(birthDay string, countDay ...string) (int, error) {
birthTime, err := time.Parse("2006-01-02", birthDay)
if err != nil {
return 0, err
}
// 获取当前时间
countTime := time.Now()
if len(countDay) > 0 {
// 计算时间节点
times, err := time.Parse("2006-01-02", countDay[0])
if err != nil {
return 0, err
}
countTime = times
}
// 用年计算年龄
age := countTime.Year() - birthTime.Year()
// 如果计算月份小于出生月份 则不到计算年份生日
if countTime.Month() < birthTime.Month() {
age -= 1
return age, nil
}
// 如果计算日期天小于出生日期 则不到计算年份生日
if countTime.Month() == birthTime.Month() && countTime.Day() < birthTime.Day() {
age -= 1
return age, nil
}
return age, nil
}