// Package wrapper ... // // Description : wrapper ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2023-06-11 21:02 package wrapper import ( "encoding/json" "errors" "git.zhangdeman.cn/zhangdeman/op_type" "github.com/tidwall/gjson" "reflect" "strings" ) // ArrayType 数组实例 // // Author : go_developer@163.com<白茶清欢> // // Date : 21:03 2023/6/11 func ArrayType[Bt op_type.BaseType, ExtractDataType op_type.BaseType](value []Bt) *Array[Bt, ExtractDataType] { at := &Array[Bt, ExtractDataType]{ value: value, } return at } // Array ... // // Author : go_developer@163.com<白茶清欢> // // Date : 21:05 2023/6/11 type Array[Bt op_type.BaseType, ExtractDataType op_type.BaseType] struct { value []Bt convertErr error itemType reflect.Kind // 简单list场景下, 每一项的数据类型 } // IsNil 输入是否为nil // // Author : go_developer@163.com<白茶清欢> // // Date : 21:11 2023/6/11 func (at *Array[Bt, ExtractDataType]) IsNil() bool { return at.value == nil } // ToStringSlice ... // // Author : go_developer@163.com<白茶清欢> // // Date : 11:42 2024/4/22 func (at *Array[Bt, ExtractDataType]) ToStringSlice() []string { list := make([]string, 0) for _, item := range at.value { byteData, _ := json.Marshal(item) list = append(list, strings.Trim(string(byteData), "\"")) } return list } // Unique 对数据结果进行去重 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:43 2023/6/12 func (at *Array[Bt, ExtractDataType]) Unique() []Bt { result := make([]Bt, 0) dataTable := make(map[string]bool) for _, item := range at.value { byteData, _ := json.Marshal(item) k := string(byteData) if strings.HasPrefix(k, "\"\"") && strings.HasSuffix(k, "\"\"") { k = string(byteData[1 : len(byteData)-1]) } if _, exist := dataTable[k]; exist { continue } dataTable[k] = true result = append(result, item) } return result } // Has 查询一个值是否在列表里, 在的话, 返回首次出现的索引, 不在返回-1 // // Author : go_developer@163.com<白茶清欢> // // Date : 16:28 2023/7/31 func (at *Array[Bt, ExtractDataType]) Has(input Bt) int { for idx := 0; idx < len(at.value); idx++ { if reflect.TypeOf(at.value[idx]).String() != reflect.TypeOf(input).String() { // 类型不同 continue } sourceByte, _ := json.Marshal(at.value[idx]) inputByte, _ := json.Marshal(input) if string(sourceByte) != string(inputByte) { continue } return idx } return -1 } // ToString ... // // Author : go_developer@163.com<白茶清欢> // // Date : 16:57 2023/9/28 func (at *Array[Bt, ExtractDataType]) ToString() StringResult { if at.IsNil() { return StringResult{ Value: "", Err: nil, } } byteData, err := json.Marshal(at.value) return StringResult{ Value: string(byteData), Err: err, } } // ToStringWithSplit 数组按照指定分隔符转为字符串 // // Author : go_developer@163.com<白茶清欢> // // Date : 17:42 2023/10/25 func (at *Array[Bt, ExtractDataType]) ToStringWithSplit(split string) StringResult { if at.IsNil() { return StringResult{ Value: "", Err: nil, } } return StringResult{ Value: strings.Join(at.ToStringSlice(), split), Err: nil, } } // ExtractField 提取指定字段, 转换成数组 // // Author : go_developer@163.com<白茶清欢> // // Date : 15:24 2024/8/6 func (at *Array[Bt, ExtractDataType]) ExtractField(fieldPath string) ([]ExtractDataType, error) { strValResult := at.ToString() if nil != strValResult.Err { return make([]ExtractDataType, 0), nil } gjsonResult := gjson.Parse(strValResult.Value) if !gjsonResult.IsArray() { return make([]ExtractDataType, 0), errors.New("input value is not slice") } arrList := gjsonResult.Array() if len(arrList) == 0 { return make([]ExtractDataType, 0), nil } res := make([]ExtractDataType, 0) for _, item := range arrList { valueResult := item.Get(fieldPath) if !valueResult.Exists() { // 不存在 continue } var val ExtractDataType if err := ConvertAssign(&val, valueResult.String()); nil != err { return nil, err } res = append(res, val) } return res, nil } // ExtractFieldIgnoreError 提取指定字段并忽略异常 // // Author : go_developer@163.com<白茶清欢> // // Date : 15:28 2024/8/6 func (at *Array[Bt, ExtractDataType]) ExtractFieldIgnoreError(field string) []ExtractDataType { res, _ := at.ExtractField(field) return res }