在排序比较函数中进行错误处理

huangapple go评论82阅读模式
英文:

Error handling inside a sort comparator function

问题

我有以下代码来按整数的值对整数字符串切片进行排序。如果错误不为nil,如何在sortSlice函数中返回err1和err2错误?比较器的返回值由sort函数使用,所以我不确定如何返回错误。

func (o *Object) sortSlice() error {
    sort.Slice(mySlice, func(i, j int) bool {
        numA, err1 := strconv.Atoi(mySlice[i])
        numB, err2 := strconv.Atoi(mySlice[j])
        if err1 != nil {
            return false
        }
        if err2 != nil {
            return true
        }
        return numA > numB
    })
    return nil
}

在sortSlice函数中,你可以检查err1和err2的值,如果它们不为nil,可以根据需要采取适当的错误处理措施。在这个例子中,我简单地返回了nil作为错误,但你可以根据实际情况进行修改。

英文:

I have the following code to sort a slice of integer strings by the value of the integers. What would be the way to return the err1 and err2 errors in the sortSlice function, in case the error is not nil? The return of the comparator is used by the sort function, so I'm not sure how to return the error.

func (o *Object) sortSlice() error {

        sort.Slice(mySlice, func(i, j int) bool {
		     numA, err1 := strconv.Atoi(mySlice[i])
			 numB, err2 := strconv.Atoi(mySlice[j])
			 return numA > numB
		})
}

答案1

得分: 2

你可能想要通过一次遍历数组将其转换为整数,而不是调用Atoi函数n^2次:

ints := make([]int, 0, len(mySlice))
for _, x := range mySlice {
   v, err := strconv.Atoi(x)
   if err != nil {
     return err
   }
   ints = append(ints, v)
}
sort.Slice(mySlice, func(i, j int) bool { return ints[i] > ints[j] })

然而,在一般情况下,你可能想要在外部作用域中设置一个错误:

var err error
sort.Slice(mySlice, func(i, j int) bool {
    numA, err1 := strconv.Atoi(mySlice[i])
    if err1 != nil && err == nil {
        err = err1
    }
    numB, err2 := strconv.Atoi(mySlice[j])
    if err2 != nil && err == nil {
        err = err2
    }
    return numA > numB
})
return err

上述代码将捕获第一个检测到的错误。

英文:

You might want to pass through that array once to convert to ints, instead of calling Atoi n^2 times:

ints:=make([]int,0,len(mySlice)
for _,x:=range mySlice {
   v, err:=strconv.Atoi(x)
   if err!=nil {
     return err
   }
   ints=append(ints,v)
}
sort.Slice(mySlice,func(i,j int) bool {return ints[i]>ints[j]})

In the general case though, you might want to set an error in the outer scope:

 var err error
 sort.Slice(mySlice, func(i, j int) bool {
             numA, err1 := strconv.Atoi(mySlice[i])
             if err1!=nil && err==nil {
               err=err1
             }
             numB, err2 := strconv.Atoi(mySlice[j])
             if err2!=nil && err==nil {
               err=err2
             }
             return numA > numB
        })
  return err

The above code will capture the first detected error.

huangapple
  • 本文由 发表于 2021年8月4日 08:24:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/68644096.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定