golang list使用 双层 循环 删除 遍历
queue队列:
import (
"container/list"
"sync"
)
type Queue struct {
l *list.List
m sync.Mutex
}
func NewQueue() *Queue {
return &Queue{l: list.New()}
}
func (q *Queue) PushBack(v interface{}) {
if v == nil {
return
}
q.m.Lock()
defer q.m.Unlock()
q.l.PushBack(v)
}
func (q *Queue) Front() *list.Element {
q.m.Lock()
defer q.m.Unlock()
return q.l.Front()
}
func (q *Queue) Remove(e *list.Element) {
if e == nil {
return
}
q.m.Lock()
defer q.m.Unlock()
q.l.Remove(e)
}
func (q *Queue) Len() int {
q.m.Lock()
defer q.m.Unlock()
return q.l.Len()
}
这样就基本满足了.
使用过程中, 发现list有个小坑: 遍历的时候不能Remove
for e := l.Front(); e != nil; e = e.Next {
l.Remove(e)
}
按照设想, 这应该会移除list里所有的元素, 但是, 结果是只移除了第一个. 原因是: Remove时候, e.next = nil, 使得for判断中, e != nil不成立了, 所以退出了循环.
这时候有两种解决办法:
var next *list.Element
for e := l.Front(); e != nil; e = next {
next = e.Next()
l.Remove(e)
}
for {
e := l.Front()
if e == nil {
break
}
l.Remove(e)
}
如果是双层循环删除的话, 注意如果第二个循环删除的元素在第一个删除的元素后一位, 需要再前进一位:
if j == nexte {
nexte = nexte.Next()
}
golang list使用 双层 循环 删除 遍历的更多相关文章
- Java中循环删除list中元素的方法总结
印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后在今天使用的时候发现报错了,然后去科普了一下,发现这是一个误区.下面我们来一起看一下. Java中循环遍 ...
- JAVA中循环删除list中元素的方法总结【转】
印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...
- python中循环删除列表中元素时的坑!
循环删除列表中元素时千万别用正序遍历,一定要用反序遍历! 废话不多说,先上案例代码: def test(data): for i in data: data.remove(i) return data ...
- JAVA中循环删除list中元素
文章来源: https://www.cnblogs.com/pcheng/p/5336903.html JAVA中循环遍历list有三种方式for循环.增强for循环(也就是常说的foreach循环) ...
- JAVA中循环删除list中元素的方法总结(同上篇)
印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...
- python循环删除列表元素常见错误与正确方法
python循环删除列表元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 常见错误 常见错误一:使用固定长度循环删除列表元素 # 使用固定长度循环pop方法删除列表元素 num_list_ ...
- shell 数组,双层循环打印变量
双层循环,打印循环执行次数. 特别注意 ,shell 脚本赋值时 '=' 两侧不能有空格,否则报错,shell command not found 但在if 语句中需要有: STR1="ab ...
- go语言从零学起(二)--list循环删除元素(转载)
本篇系转载 在使用go的container/list的package时,你可能会无意间踩一个小坑,那就是list的循环删除元素. list删除元素,直观写下来的代码如下: package main i ...
- list循环删除单个元素
摘自https://www.cnblogs.com/pcheng/p/5336903.html JAVA中循环删除list中元素的方法总结 JAVA中循环遍历list有三种方式for循环.增强for循 ...
随机推荐
- js 跳出for/for in/each/for each 循环
写本文原因:最近用到了for in,用return true跳出本次循环,执行下次循环, 结果发现程序没有预期效果,经过调试发现误用了return true, 特此笔记,欢迎指正. 注意:return ...
- 【Hibernate】入门
一.Hibernate框架的概述 1.1 什么是Hibernate 1.2 Hibernate优点 二.Hibernate的日志记录 三.Hibernate 入门程序 3.1 引入依赖(5.x版本) ...
- Computer Vision_33_SIFT:Evaluation of Interest Point Detectors——2000
此部分是计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面.对于自己不太熟悉的领域比如摄像机标定和立体视觉,仅仅列出上google上引用次数比较多的文献.有一些刚刚出版的 ...
- C#当中的BeginInvoke和EndInvoke
我们已经知道 C#当中 存在async/await .BackGroudWorker类以及TPL(任务并行库).当然C#还有一些旧的模式来支持异步编程.参考<C#图解教程> 1. Beg ...
- 解决使用JPA时对象在set属性时更新了数据库问题
https://www.jianshu.com/p/1100814ff54f 之前也遇到过一次这个问题,打印的日志中也可以看见update相关的sql语句,但当时不知道为什么会去自动更新,就用了别的方 ...
- TCP的服务简单介绍
1 引言尽管T C P和U D P都使用相同的网络层(I P),T C P却向应用层提供与U D P完全不同的服务.T C P提供一种面向连接的.可靠的字节流服务.面向连接意味着两个使用 T C P的 ...
- 修改HTTPS加密协议TLS1.0为TLS1.2
一:首先为什么要改为TLS1.2 因为各大浏览器相继发布声明将停止支持 TLS 1.0 和 TLS 1.1 https://www.cnblogs.com/jpush88/p/9846047.html ...
- Requests的基础学习
官方文档链接:http://cn.python-requests.org/zh_CN/latest/ 安装: pip install requests 错误异常: 1.所有Requests显式抛出的异 ...
- 注册emf package并读取EMF文件
/** * 读EMF文件 * * @param uri * @return */ public static Resource readEMFFile(URI uri) { ResourceSet r ...
- Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2) C. p-binary
链接: https://codeforces.com/contest/1247/problem/C 题意: Vasya will fancy any number as long as it is a ...