【发布时间】:2019-02-05 05:21:59
【问题描述】:
Go 不提供任何高级函数来从切片中删除元素。我编写了一个函数,它以这里通常建议的方式从切片中删除给定值,但它产生了非常意想不到的结果。
package main
import "fmt"
type Area struct {
Cells [2][]uint8
}
func main() {
var area1 Area
area1.Cells[1] = []uint8 {5, 6, 7}
area2 := area1
area1.Cells[1] = removeValueFromCell(area1.Cells[1], 6)
fmt.Println(area1.Cells[1])
fmt.Println(area2.Cells[1])
}
func removeValueFromCell(cell []uint8, value uint8) []uint8{
var res = cell
for i := 0; i < len(cell); i++ {
if cell[i] == value {
res = append(cell[:i], cell[i+1:]...)
}
}
return res
}
这个程序输出:
[5 7] <- as expected
[5 7 7] <- why not [5 6 7] or [5 7] ?
【问题讨论】:
-
当您找到匹配项时,您并没有跳出 @987654324@ 循环,也没有更新
i以说明数组末尾在删除,如果您有意不跳出循环以查找更多匹配项,则需要执行此操作。 -
阿德里安谢谢。你是对的,我在编写其他更大的代码时遇到了这个问题,所以我尽可能地修剪和简化代码以复制问题