”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 Go 中迭代地从切片中删除元素?

如何在 Go 中迭代地从切片中删除元素?

发布于2024-11-07
浏览:200

How to Remove Elements from a Slice Iteratively in Go?

迭代地从切片中删除元素

迭代切片时,由于移动而在循环中删除元素可能会很棘手后续元素。一种常见的错误方法是使用追加来删除元素,如下例所示:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := range a { // BAD
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i 1:]...)
    }
}

此方法无法正常工作,因为循环不考虑移位的元素。要在迭代时正确删除元素,您可以使用向下循环或采用避免不断复制操作的替代方法。

向下循环

向下循环迭代相反的顺序,从最后一个元素开始。这种方法允许您删除元素,而无需手动递减循环变量:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
for i := len(a) - 1; i >= 0; i-- {
    if conditionMeets(a[i]) {
        a = append(a[:i], a[i 1:]...)
    }
}

多次删除的替代方法

如果需要删除大量元素,由于复制过多,使用追加可能效率低下。另一种方法是创建一个新切片并仅复制不可移动元素:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
b := make([]string, len(a))
copied := 0
for _, s := range(a) {
    if !conditionMeets(s) {
        b[copied] = s
        copied  
    }
}
b = b[:copied]

多次删除的就地删除(通用)

就地删除技术涉及维护两个索引并分配非同一切片中的可移除元素,同时将已移除元素位置清零:

a := []string{"abc", "bbc", "aaa", "aoi", "ccc"}
copied := 0
for i := 0; i 
最新教程 更多>
  • 如何在 Django 中创建一个简单的调度程序
    如何在 Django 中创建一个简单的调度程序
    如果您需要每 X 分钟/秒等运行一个函数来进行一些清理,触发一些操作,您可以在线程模块和 django 自定义 cli 的帮助下执行一个简单的调度程序命令。 假设我想每 5 秒调用一个函数以在外部 API 上发布一些内容。 在您的 django 应用程序中创建一个名为 management 的文件夹...
    编程 发布于2024-11-08
  • 引导实用程序
    引导实用程序
    Bootstrap 实用程序是一组功能强大的类,可以让您的网站样式设置更轻松、更快捷,而无需编写自定义 CSS。让我们深入了解基础知识! 什么是 Bootstrap 实用程序? Bootstrap 实用程序是预定义的 CSS 类,您可以将它们直接应用于 HTML 元素以控制其外观或行为。这些实用程序...
    编程 发布于2024-11-07
  • 修复下拉菜单/工具提示等隐藏的溢出
    修复下拉菜单/工具提示等隐藏的溢出
    您是否曾尝试为您的按钮创建一个下拉列表,然后选择但随后被溢出隐藏阻止? 然后你该怎么做,然后你使用javascript将元素扔到DOM的根目录,然后根据触发元素矩形定位元素,每次布局更改时重新计算,发生滚动和调整窗口大小,不是很有效的。 首先我想说的是它还没有完全支持,但是现在有一个polyfill...
    编程 发布于2024-11-07
  • 如何使用中间件方法有效处理 Gin Web 应用程序中的错误?
    如何使用中间件方法有效处理 Gin Web 应用程序中的错误?
    增强 Gin 中的错误处理Gin 的自定义错误处理涉及使用中间件来处理错误响应。这允许错误逻辑与正常流程逻辑分离。错误处理中间件type appError struct { Code int Message string } func JSONAppErrorReporter(...
    编程 发布于2024-11-07
  • 如何使用 Python 和 Medium API 将文章发布到 Medium
    如何使用 Python 和 Medium API 将文章发布到 Medium
    介绍 作为使用 Obsidian 撰写文章的人,我经常发现自己在发布到 Medium 时需要手动复制和格式化我的内容。此过程可能非常耗时且重复,尤其是在处理 Markdown 文件时。为了简化我的工作流程,我决定开发一个 Python 脚本,自动将 Markdown 文件直接发布到...
    编程 发布于2024-11-07
  • 如何使用 Unicode 字符引用来表示 CSS 类名称中的百分比?
    如何使用 Unicode 字符引用来表示 CSS 类名称中的百分比?
    .container.\31 25\25在CSS中是什么意思?在CSS中,标识符可以包含特殊字符,例如反斜杠 ()。反斜杠字符在 CSS 中具有不同的用途,具体取决于上下文。转义字符在字符串中,反斜杠后跟换行符将被忽略。在字符串之外,反斜杠后跟换行符代表其自身。转义特殊字符反斜杠可用于转义特殊 CS...
    编程 发布于2024-11-07
  • 工作跟踪应用程序
    工作跟踪应用程序
    使用 MERN Stack 构建工作跟踪应用程序 在当今竞争激烈的就业市场中,在求职过程中保持井然有序可能具有挑战性。手动管理申请、面试和后续跟进很容易变得不堪重负。为了解决这个问题,我决定使用 MERN 堆栈构建一个作业跟踪应用程序。这个项目是一次有益的经历,使我能够将我的技术技...
    编程 发布于2024-11-07
  • C++ 中的“long”保证至少有 32 位吗?
    C++ 中的“long”保证至少有 32 位吗?
    long 保证有 32 位吗?尽管基于 C 标准的常见假设,但问题是 long 是否保证有至少 32 位。标准将基本整数类型分类为:sizeof(char) ≤ sizeof(short int) ≤ sizeof(int) ≤ sizeof(long int)然而,许多人认为基于此层次结构,lon...
    编程 发布于2024-11-07
  • 加权图类
    加权图类
    The WeightedGraph class extends AbstractGraph. The preceding chapter designed the Graph interface, the AbstractGraph class, and the UnweightedGraph cl...
    编程 发布于2024-11-07
  • 从新手到忍者:为开发人员释放 Git 的力量
    从新手到忍者:为开发人员释放 Git 的力量
    Git 是每个开发者工具包中不可或缺的工具。它不仅可以帮助您有效管理代码库,还可以与团队成员无缝协作。然而,开发人员常常忽视 Git 提供的一些强大的功能和工作流程。在本博客中,我们将探讨基本的 Git 提示和技巧,以帮助开发人员简化工作流程、更有效地管理分支、轻松解决冲突以及集成 GitHub A...
    编程 发布于2024-11-07
  • 通用选择器在现代浏览器中仍然是性能杀手吗?
    通用选择器在现代浏览器中仍然是性能杀手吗?
    通用选择器对性能的影响通用选择器 (*) 将 CSS 样式应用于文档中的所有元素。虽然它曾经被认为对性能有害,但现代浏览器的进步已经减轻了它的影响。等效规则通用选择器规则 (* { margin: 0; padding : 0; }) 在功能上等同于更具体的规则 (body, h1, p { mar...
    编程 发布于2024-11-07
  • Effect-TS 中的压缩选项:实用指南
    Effect-TS 中的压缩选项:实用指南
    Effect-TS 中的压缩选项:实用指南 在函数式编程中,以安全且可预测的方式组合多个可选值(表示为选项)是一项常见任务。 Effect-TS 提供了多种将选项“压缩”在一起的方法,允许您组合它们的值或根据特定规则选择一个。在本文中,我们将探讨压缩选项的三个关键函数:O.zipR...
    编程 发布于2024-11-07
  • 提升你的 JavaScript:深入研究面向对象编程✨
    提升你的 JavaScript:深入研究面向对象编程✨
    面向对象编程 (OOP) 是一种强大的范例,它彻底改变了我们构建和组织代码的方式。 虽然 JavaScript 最初是一种基于原型的语言,但它已经发展到接受 OOP 原则,特别是随着 ES6 的引入和后续更新。 这篇文章深入研究了 JavaScript 中 OOP 的核心概念,探索如何实现它们来...
    编程 发布于2024-11-07
  • 如何在 Go 中捕获多个引用组:正则表达式解决方案
    如何在 Go 中捕获多个引用组:正则表达式解决方案
    在 Go 中捕获多个引用组本文解决了解析遵循特定格式的字符串的挑战:大写命令后跟可选引用的论点。目标是将命令和参数提取为单独的字符串。要处理此任务,需要使用正则表达式: re1, _ := regexp.Compile(([A-Z] )(?: " (1)")*)。第一个捕获组 (...
    编程 发布于2024-11-07
  • 从初学者到构建者:掌握 PHP 编程艺术
    从初学者到构建者:掌握 PHP 编程艺术
    想要学习PHP编程?分步指南帮您轻松入门!首先,安装PHP([官方网站](https://www.php.net/))。掌握变量、条件语句和循环等基本语法。通过构建一个简单的登录表单来实践:提交表单后,处理输入并验证凭证。通过这些步骤和练习,您将掌握PHP编程的基础知识。PHP编程入门指南:从初学者...
    编程 发布于2024-11-07

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3