英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论