当前位置: 首页 > 知识库问答 >
问题:

如何(简洁地)从Go中的切片中删除第一个元素?

谢财
2023-03-14

我在Go中构建了一个简单的队列。它使用内部切片来跟踪其元素。元素通过附加到切片而被推送到队列中。我想实现。通过删除元素中的第一个元素,弹出()

在许多其他语言中,“弹出”列表的第一个元素是一行,这使我相信下面的实现是草率和冗长的。有更好的办法吗?

type Queue struct {
    elements []interface{}
}

func (queue *Queue) Push(element interface{}) {
    queue.elements = append(queue.elements, element)
}

func (queue *Queue) Pop() interface{} {
    element := queue.elements[0]
    if len(queue.elements) > 1 {
        queue.elements = queue.elements[1:]
    } else {
        queue.elements = make([]interface{}, 0)
    }
    return element
}

请注意,如果len(Queue.elements)=0,我希望队列死机。我没有检查边界不是疏忽。


共有2个答案

穆正祥
2023-03-14

如果您想要一个环形缓冲区或FIFO结构,那么使用@Everton的答案中的切片将导致垃圾收集问题,因为底层数组可能会无限增长。

在go中实现这一点的最简单方法是,如果您不介意限制大小,则使用一个对并发访问同样安全的通道。这是围棋中非常常见的一个习惯用法,您通常不会费心将其包装成下面这样的类型。

Eg(操场)

package main

import "fmt"

type Queue struct {
    elements chan interface{}
}

func NewQueue(size int) *Queue {
    return &Queue{
        elements: make(chan interface{}, size),
    }
}

func (queue *Queue) Push(element interface{}) {
    select {
    case queue.elements <- element:
    default:
        panic("Queue full")
    }
}

func (queue *Queue) Pop() interface{} {
    select {
    case e := <-queue.elements:
        return e
    default:
        panic("Queue empty")
    }
    return nil
}

func main() {
    q := NewQueue(128)

    q.Push(1)
    q.Push(2)
    q.Push(3)
    fmt.Printf("Pop %d\n", q.Pop())
    fmt.Printf("Pop %d\n", q.Pop())
    fmt.Printf("Pop %d\n", q.Pop())
    fmt.Printf("Pop %d\n", q.Pop())

}
陈康胜
2023-03-14

你试过这些吗?

从队列中弹出

x, a = a[0], a[1:]

从堆栈弹出

x, a = a[len(a)-1], a[:len(a)-1]

a = append(a, x)

来自:https://code.google.com/p/go-wiki/wiki/SliceTricks

 类似资料:
  • 问题内容: 我在Go中建立了一个简单的队列。它使用内部切片来跟踪其元素。通过附加到切片将元素推入队列。我想通过删除中的第一个元素来实现。 在许多其他语言中,“弹出”列表的第一个元素是一个单行,这使我相信下面的实现是草率而冗长的。有没有更好的办法? 请注意,如果,我会感到恐慌。我不检查界限不是疏忽大意。 问题答案: 你尝试过这些吗? 从队列弹出 从堆栈弹出 推 来自:https : //code.g

  • 主要内容:从开头位置删除,从中间位置删除,从尾部删除Go语言并没有对删除切片元素提供专用的语法或者接口,需要使用切片本身的特性来删除元素,根据要删除元素的位置有三种情况,分别是从开头位置删除、从中间位置删除和从尾部删除,其中删除切片尾部的元素速度最快。 从开头位置删除 删除开头的元素可以直接移动数据指针: 也可以不移动数据指针,但是将后面的数据向开头移动,可以用 append 原地完成(所谓原地完成是指在原有的切片数据对应的内存区间内完成,不会导致

  • 我正在使用这个命令从切片中删除一个元素,但它不起作用,请建议。

  • 问题内容: 这个带有添加功能的删除技巧如何工作? 似乎它正在抓取第一个元素(空数组)之前的所有内容 然后将所有内容附加在第一个元素之后(位置零) …(点对点)有什么作用? 问题答案: 切片在哪里,是要删除的元素的索引: 是Go中可变参数的语法。 基本上,在 定义 函数时,它将把您传递的所有参数放入该类型的一个切片中。这样,您可以传递任意数量的参数(例如,可以传递任意数量的参数)。 现在,当 调用

  • 问题内容: 我进行了以下测试,即打印原始输入切片(过滤后),而没有删除元素,但是最后有一个额外的元素,使输入切片具有相同的长度,即使过滤后应该较短。 我已经看过这篇文档https://github.com/golang/go/wiki/SliceTricks#delete 但是我认为我缺少有关Go的一些技巧,因为似乎我使用的切片方法错误。 如何避免出现“输出片段”?(以正确的方式打印,包含正确的元

  • 问题内容: 我已经看过这篇文章: Python:通过删除每个第n个元素从现有列表构建新列表,但是由于某些原因,它对我不起作用: 我这样尝试: 此函数需要一个列表和。然后,它使用列表中的n步删除第n个元素,并打印结果。 这是我的函数调用: 错误的输出: 代替 然后我从上面的链接尝试了一个变体: 再次,函数调用: 给了我同样的错误的结果: 不是 如何正确地从列表中删除/删除/删除 第n个 项目? 问题