func main() {
a := []string{"Hello1", "Hello2", "Hello3"}
fmt.Println(a)
// [Hello1 Hello2 Hello3]
a = append(a[:0], a[1:]...)
fmt.Println(a)
// [Hello2 Hello3]
}
这个带有添加功能的删除技巧如何工作?
似乎它正在抓取第一个元素(空数组)之前的所有内容
然后将所有内容附加在第一个元素之后(位置零)
…(点对点)有什么作用?
a
切片在哪里,i
是要删除的元素的索引:
a = append(a[:i], a[i+1:]...)
...
是Go中可变参数的语法。
基本上,在 定义
函数时,它将把您传递的所有参数放入该类型的一个切片中。这样,您可以传递任意数量的参数(例如,可以传递fmt.Println
任意数量的参数)。
现在,当 调用 一个函数时,...
做相反的事情:它将一个切片拆包,并将它们作为单独的参数传递给可变参数函数。
所以这行的作用是:
a = append(a[:0], a[1:]...)
本质上是:
a = append(a[:0], a[1], a[2])
现在,您可能想知道,为什么不做
a = append(a[1:]...)
好吧,函数的定义append
是
func append(slice []Type, elems ...Type) []Type
因此,第一个参数必须是正确类型的切片,第二个参数是可变参数,因此我们传入一个空切片,然后解压切片的其余部分以填充参数。
问题内容: 我有一个结构“ Guest”,其中包含聚会客人的元数据(唯一的ID,名称,姓氏以及作为该客人的朋友的客人的唯一ID的列表。 我有以下代码从朋友列表中删除ID: 问题是:我要删除的元素被元素的移位覆盖,但是切片不会变短。而是将切片的最后一个元素相乘。 举一个例子:是。我打电话后,结果却不是理想的。 那么,我在做什么错呢? 问题答案: 任何打算/确实修改接收器的方法都必须使用指针接收器。
主要内容:从开头位置删除,从中间位置删除,从尾部删除Go语言并没有对删除切片元素提供专用的语法或者接口,需要使用切片本身的特性来删除元素,根据要删除元素的位置有三种情况,分别是从开头位置删除、从中间位置删除和从尾部删除,其中删除切片尾部的元素速度最快。 从开头位置删除 删除开头的元素可以直接移动数据指针: 也可以不移动数据指针,但是将后面的数据向开头移动,可以用 append 原地完成(所谓原地完成是指在原有的切片数据对应的内存区间内完成,不会导致
我正在使用这个命令从切片中删除一个元素,但它不起作用,请建议。
问题内容: 我进行了以下测试,即打印原始输入切片(过滤后),而没有删除元素,但是最后有一个额外的元素,使输入切片具有相同的长度,即使过滤后应该较短。 我已经看过这篇文档https://github.com/golang/go/wiki/SliceTricks#delete 但是我认为我缺少有关Go的一些技巧,因为似乎我使用的切片方法错误。 如何避免出现“输出片段”?(以正确的方式打印,包含正确的元
问题内容: 我在Go中建立了一个简单的队列。它使用内部切片来跟踪其元素。通过附加到切片将元素推入队列。我想通过删除中的第一个元素来实现。 在许多其他语言中,“弹出”列表的第一个元素是一个单行,这使我相信下面的实现是草率而冗长的。有没有更好的办法? 请注意,如果,我会感到恐慌。我不检查界限不是疏忽大意。 问题答案: 你尝试过这些吗? 从队列弹出 从堆栈弹出 推 来自:https : //code.g
我在Go中构建了一个简单的队列。它使用内部切片来跟踪其元素。元素通过附加到切片而被推送到队列中。我想实现。 在许多其他语言中,“弹出”列表的第一个元素是一行,这使我相信下面的实现是草率和冗长的。有更好的办法吗? 请注意,如果