golang 中切片追加新元素的索引是多少

问题描述 投票:0回答:1

这是一个问题而不是错误。 我有一个指向

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

go append slice
1个回答
0
投票

用编程术语来说,将元素追加到集合中就是将其添加到集合的末尾。要在末尾以外的其他位置添加元素,或者将元素添加到无序集合中,就是insert它。

如果我们考虑删除切片中间元素的效果,也许困难会更清楚。所有切片元素是否都会向下移动,如果是,是否会在结果的新“末尾”附加一个新元素?或者切片中是否只是存在一个未填充的元素,然后“追加”的效果可能是利用腾出的空间?选择权是留给实现者的,还是 Go 规范中规定的?

Go 实际上没有从切片中间删除元素的概念。您可以编写自己的逻辑来移动所有后面的元素 [example] 或不移动,但无论哪种方式,

append
都不会真正知道您已经这样做了,并且仍然只会将元素添加到切片的末尾,其中切片的“结束”由其长度决定。

© www.soinside.com 2019 - 2024. All rights reserved.