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)
}

