golang 二维数组指定字段去重
这段代码定义了一个UniqueByField函数,它接受一个任意类型的切片和一个字段名,然后返回根据该字段去重后的切片。在main函数中,我们定义了一个Record结构体和一个示例数据切片,并演示了如何使用UniqueByField函数按ID字段去重。
package main import ( "fmt" "reflect" ) // 对结构体数组按指定字段去重 func UniqueByField(records interface{}, fieldName string) (interface{}, error) { recordsValue := reflect.ValueOf(records) if recordsValue.Kind() != reflect.Slice { return nil, fmt.Errorf("records is not a slice") } result := reflect.MakeSlice(reflect.TypeOf(records), 0, recordsValue.Len()) fieldMap := make(map[interface{}]bool) for i := 0; i < recordsValue.Len(); i++ { record := recordsValue.Index(i) fieldValue := record.FieldByName(fieldName).Interface() if _, ok := fieldMap[fieldValue]; !ok { fieldMap[fieldValue] = true result = reflect.Append(result, record) } } return result.Interface(), nil } func main() { // 示例结构体定义 type Record struct { ID int Name string Value string } // 示例数据 records := []Record{ {ID: 1, Name: "Alice", Value: "v1"}, {ID: 2, Name: "Bob", Value: "v2"}, {ID: 1, Name: "Alice", Value: "v3"}, {ID: 3, Name: "Charlie", Value: "v4"}, } // 按ID去重 uniqueRecords, err := UniqueByField(records, "ID") if err != nil { panic(err) } fmt.Printf("Unique records: %+v\n", uniqueRecords) }