欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 一六九、go使用泛型封装一个可以应用于任何字段的模糊匹配

一六九、go使用泛型封装一个可以应用于任何字段的模糊匹配

2024/10/23 18:03:42 来源:https://blog.csdn.net/zm06201118/article/details/142461303  浏览:    关键词:一六九、go使用泛型封装一个可以应用于任何字段的模糊匹配

需求

针对 json数据里的user_name进行模糊搜索,返回匹配的列

参考数据

[{"id": 122,"name": "sgm_info40_b233 5.5_plus","logo": "https://bj.bcebos.com/v1/iov-recom/car_default.png","user_name": "张三","user_id": "838024601","status": 0,"product_no": "","product_status": "","sdk_id": "","kernel_no": "1.0.1","dumi_appid": "","dumi_appname": "iov_sgm_b233_2021","dumi_appversion": "5.5_plus","create_time": "2024-09-11 10:52:18","update_time": ""},{"id": 123,"name": "sgm_info40_b223 5.5","logo": "https://bj.bcebos.com/v1/iov-recom/car_default.png","user_name": "李四","user_id": "838024601","status": 0,"product_no": "","product_status": "","sdk_id": "","kernel_no": "1.0.1","dumi_appid": "","dumi_appname": "iov_sgm_b223_2021","dumi_appversion": "5.5","create_time": "2024-09-11 10:55:18","update_time": ""}
]

实现

package mainimport ("encoding/json""fmt""strings"
)type Data struct {ID            int    `json:"id"`Name          string `json:"name"`Logo          string `json:"logo"`UserName      string `json:"user_name"`UserID        string `json:"user_id"`Status        int    `json:"status"`ProductNo     string `json:"product_no"`ProductStatus string `json:"product_status"`SdkID         string `json:"sdk_id"`KernelNo      string `json:"kernel_no"`DumiAppID     string `json:"dumi_appid"`DumiAppName   string `json:"dumi_appname"`DumiAppVersion string `json:"dumi_appversion"`CreateTime    string `json:"create_time"`UpdateTime    string `json:"update_time"`
}// FilterByField 根据字段进行模糊匹配
func FilterByField[T any](data []T, fieldName string, keyword string) []T {matched := make([]T, 0)for _, item := range data {// 获取结构体的反射值val := reflect.ValueOf(item)// 检查 val 是结构体类型,若 val 是指针需要先解引用if val.Kind() == reflect.Ptr {val = val.Elem()}// 获取字段值fieldVal := val.FieldByName(fieldName)if fieldVal.IsValid() && fieldVal.Kind() == reflect.String {// 如果字段是字符串类型,进行模糊匹配if strings.Contains(fieldVal.String(), keyword) {matched = append(matched, item)}}}return matched
}func main() {jsonData := `[{"id": 97,"name": "sgm_info40_l233 7","logo": "https://bj.bcebos.com/v1/iov-recom/car_default.png","user_name": "张三","user_id": "838024601","status": 0,"product_no": "","product_status": "","sdk_id": "","kernel_no": "1.0.1","dumi_appid": "","dumi_appname": "iov_sgm_info40_l233","dumi_appversion": "7","create_time": "2024-03-07 11:43:07","update_time": ""},{"id": 98,"name": "sgm_info40_l232 1","logo": "https://bj.bcebos.com/v1/iov-recom/car_default.png","user_name": "李四","user_id": "838024601","status": 0,"product_no": "","product_status": "","sdk_id": "","kernel_no": "1.0.1","dumi_appid": "","dumi_appname": "iov_sgm_info40_l232","dumi_appversion": "1","create_time": "2024-03-07 15:03:29","update_time": ""},{"id": 110,"name": "sgm_info40_u458 5.5","logo": "https://bj.bcebos.com/v1/iov-recom/car_default.png","user_name": "王五","user_id": "838024601","status": 0,"product_no": "","product_status": "","sdk_id": "","kernel_no": "1.0.1","dumi_appid": "","dumi_appname": "iov_sgm_info40_u458","dumi_appversion": "5.5","create_time": "2024-07-25 11:23:44","update_time": ""},{"id": 111,"name": "sgm_info40_3582_hev 5.5","logo": "https://bj.bcebos.com/v1/iov-recom/car_default.png","user_name": "张三","user_id": "838024601","status": 0,"product_no": "","product_status": "","sdk_id": "","kernel_no": "1.0.1","dumi_appid": "","dumi_appname": "iov_sgm_info40_3582_hev","dumi_appversion": "5.5","create_time": "2024-07-25 11:23:44","update_time": ""}]`var data []Dataerr := json.Unmarshal([]byte(jsonData), &data)if err != nil {fmt.Println("Error parsing JSON:", err)return}// 模糊搜索 user_name 包含 "张"result := FilterByField(data, "UserName", "张")// 打印结果for _, item := range result {fmt.Printf("ID: %d, UserName: %s, Name: %s\n", item.ID, item.UserName, item.Name)}
}

输出结果

ID: 97, UserName: 张三, Name: sgm_info40_l233 7
ID: 111, UserName: 张三, Name: sgm_info40_3582_hev 5.5

解释:

  1. 泛型函数 FilterByField:这是一个使用泛型的公共方法,接受一个任意类型的切片,并根据指定的字段名进行模糊匹配。这里使用了 reflect 包来动态获取字段的值。
  2. reflect.ValueOf(item):通过反射获取结构体的字段值。
  3. FieldByName(fieldName):根据字段名获取对应的字段值,并判断其类型是否为字符串。
  4. strings.Contains:对字段值进行模糊匹配。
  5. fieldVal.IsValid(): 判断通过反射获取的字段值是否有效。具体来说,IsValid() 返回一个布尔值,如果字段存在并且可访问,返回 true,否则返回 false。
  6. fieldVal.Kind(): 返回一个 reflect.Kind 值,用于表示通过反射获取到的值的基础类型。Kind() 是枚举类型,表示 Go 中的基本类型,例如 reflect.String, reflect.Int, reflect.Struct 等。使用 Kind() 可以检查字段的数据类型,然后根据类型执行不同的操作。
  7. val.Elem():检查 输入对象是结构体类型,若是指针需要通过Elem()先解引用。

优点:

泛型使得这个方法可以适用于任何结构体类型。
反射使得可以通过字段名动态访问字段。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com