这是一个问题而不是错误。 我有一个指向
dataset
对象的指针,因此:
var Datasets []*Dataset
(实际上这是结构体中的一个字段,但问题是一样的)
我有一个名为
timeStamp
的变量,它用作该数组的索引,例如:
name:= *Datasets[timestamp].Name
每个新的
Dataset
都会添加到 Datasets
切片中,如下所示:
Datasets = append(user.Datasets, &new_dataset)
我的问题是:刚刚添加到
Datasets
的新项目的索引是什么?我假设 append
只是在切片的“末尾”添加新项目(有关“结束”的稍微更精确的定义,请参见下文)。但在我看到的文档中(例如here),它实际上并没有说明附加元素的数组索引是什么。所以在这个例子中我们有:
func main() {
var s []int
printSlice(s)
// append works on nil slices.
s = append(s, 0)
printSlice(s)
// The slice grows as needed.
s = append(s, 1)
printSlice(s)
// We can add more than one element at a time.
s = append(s, 2, 3, 4)
printSlice(s)
}
但这并没有明确说明我会在
s[0]
或s[1]
中找到什么。
直观上很明显,
s[0]=0
,s[1]=1
,等等。但我不想依赖没有记录或明确说明的行为。
如果我们考虑删除切片中间元素的效果,也许困难会更清楚。所有切片元素是否都会向下移动,如果是,是否会在结果的新“末尾”附加一个新元素?或者切片中是否只是存在一个未填充的元素,然后“追加”的效果可能是利用腾出的空间?选择权是留给实现者的,还是 Go 规范中规定的?
表述这个问题的另一种方式,更笼统一点,也许是问在一系列追加之后,切片中元素的顺序是否保留了在此序列中添加新元素的实际顺序。
可能这个问题在有关删除等操作的更详细文档中得到了解答,但我还没有找到它。
这不是一个紧迫的问题,但我欢迎您的回答,因为如上所述,我不想依赖于无法保证的行为。
A
用编程术语来说,将元素追加到集合中就是将其添加到集合的末尾。要在末尾以外的其他位置添加元素,或者将元素添加到无序集合中,就是insert它。
如果我们考虑删除切片中间元素的效果,也许困难会更清楚。所有切片元素是否都会向下移动,如果是,是否会在结果的新“末尾”附加一个新元素?或者切片中是否只是存在一个未填充的元素,然后“追加”的效果可能是利用腾出的空间?选择权是留给实现者的,还是 Go 规范中规定的?
Go 实际上没有从切片中间删除元素的概念。您可以编写自己的逻辑来移动所有后面的元素 [example] 或不移动,但无论哪种方式,
append
都不会真正知道您已经这样做了,并且仍然只会将元素添加到切片的末尾,其中切片的“结束”由其长度决定。