golang 二维数组指定字段去重

作者: adm 分类: go 发布时间: 2024-07-30

这段代码定义了一个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)
}

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!