在切片上范围时从切片中删除项目的最佳方法是什么?
例如:
type MultiDataPoint []*DataPoint
func (m MultiDataPoint) Json() ([]byte, error) {
for i, d := range m {
err := d.clean()
if ( err != nil ) {
//Remove the DP from m
}
}
return json.Marshal(m)
}
原文由 Kyle Brandt 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如您在其他地方提到的,您可以分配新的内存块并仅向其复制有效元素。但是,如果你想避免分配,你可以就地重写你的切片:
完整示例: http ://play.golang.org/p/FNDFswPeDJ
请注意,这将在底层数组中的索引
i
之后保留旧值,因此如果值是或包含指针,这 将泄漏内存,直到切片本身被垃圾收集。您可以通过在截断之前将所有值设置为 nil 或从 i 到切片末尾的零值来解决此问题。