🧑‍💻 replace reflect.DeepEqual with custom func for arg comparison. (#16884)

This commit is contained in:
Jane Haring 2026-01-23 20:19:53 +08:00 committed by GitHub
parent fb5d170df2
commit 30bf687d1b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -91,7 +91,7 @@ func containTask(task *Task, tasks []*Task) bool {
}
for i, arg := range t.Args {
if !reflect.DeepEqual(arg, task.Args[i]) {
if !areArgsEqual(arg, task.Args[i]) {
return false
}
}
@ -101,6 +101,90 @@ func containTask(task *Task, tasks []*Task) bool {
return false
}
// areArgsEqual 比较两个参数是否相等
func areArgsEqual(a, b interface{}) bool {
// 如果两个参数都为 nil
if a == nil && b == nil {
return true
}
if a == nil || b == nil {
return false
}
// 快速处理常见的基本类型
switch av := a.(type) {
case string:
if bv, ok := b.(string); ok {
return av == bv
}
case int:
if bv, ok := b.(int); ok {
return av == bv
}
case int64:
if bv, ok := b.(int64); ok {
return av == bv
}
case int32:
if bv, ok := b.(int32); ok {
return av == bv
}
case bool:
if bv, ok := b.(bool); ok {
return av == bv
}
case float64:
if bv, ok := b.(float64); ok {
return av == bv
}
case float32:
if bv, ok := b.(float32); ok {
return av == bv
}
case uint:
if bv, ok := b.(uint); ok {
return av == bv
}
case uint64:
if bv, ok := b.(uint64); ok {
return av == bv
}
case uint32:
if bv, ok := b.(uint32); ok {
return av == bv
}
case []string:
if bv, ok := b.([]string); ok {
if len(av) != len(bv) {
return false
}
for i := range av {
if av[i] != bv[i] {
return false
}
}
return true
}
case []int:
if bv, ok := b.([]int); ok {
if len(av) != len(bv) {
return false
}
for i := range av {
if av[i] != bv[i] {
return false
}
}
return true
}
}
// 未处理的复杂类型,回退到 reflect.DeepEqual
return reflect.DeepEqual(a, b)
}
func getCurrentTasks() (ret []*Task) {
queueLock.Lock()
defer queueLock.Unlock()