gpt4 book ai didi

arrays - 如何创建非连续数组索引 slice

转载 作者:行者123 更新时间:2023-12-02 06:56:14 24 4
gpt4 key购买 nike

我试图更好地理解 slice 。

例如,在 Fortran 中,如果我有一个二维数组,我可以使用 matrix(:, (/2, 5, 9/)) 创建一个 slice 。该 slice 仅包含第 2、5 和 9 行。我正在尝试找到一种在 Go 中创建类似 slice 的方法。

我知道我可以像这样使用附加:

var slice [][N]
slice = append(arr[1],arr[4],arr[8])

并且 slice 具有正确的值,但是 append 会复制这些值,因此如果我更新数组,我的 slice 不会更新。

在 Go 中是否有正确的方法来做到这一点?

最佳答案

引用自Spec: Slice types:

A slice is a descriptor for a contiguous segment of an underlying array and provides access to a numbered sequence of elements from that array.

slice 始终表示底层数组的连续段,不能在开始索引和结束索引之间跳过元素。

使用指针 slice

您可以用指针来模仿行为,但它们将成为具有所有优点和缺点的指针。例如:

const N = 3

s := make([][N]int, 10)
s[2] = [3]int{20, 21, 22}
s[5] = [3]int{50, 51, 52}
s[9] = [3]int{90, 91, 92}

s2 := []*[N]int{&s[2], &s[5], &s[9]}
for _, p := range s2 {
fmt.Print(*p, " ")
}

s[2][0] = 66
fmt.Println()
for _, p := range s2 {
fmt.Print(*p, " ")
}

创建并填充 s2(根据 s 的元素)后,我们修改 s 的元素,并打印 s2 再次,我们看到更改后的更新值。输出(在 Go Playground 上尝试):

[20 21 22] [50 51 52] [90 91 92] 
[66 21 22] [50 51 52] [90 91 92]

使用 slice 的 slice

slice ( slice 头)与指针类似:它们是小型的类似结构的数据结构,其中包含指向 slice 第一个元素的指针,指向底层数组中的某个位置。详情见Are golang slices passed by value?why slice values can sometimes go stale but never map values?

因此,如果您使用 slice slice 而不是数组 slice ,则无需指针即可工作( slice 值已包含指针)。

请参阅此示例:

s := make([][]int, 10)
s[2] = []int{20, 21, 22}
s[5] = []int{50, 51, 52}
s[9] = []int{90, 91, 92}

s2 := [][]int{s[2], s[5], s[9]}
fmt.Println(s2)

s[2][0] = 66
fmt.Println(s2)

这将输出(在 Go Playground 上尝试):

[[20 21 22] [50 51 52] [90 91 92]]
[[66 21 22] [50 51 52] [90 91 92]]

查看相关问题:How is two dimensional array's memory representation

关于arrays - 如何创建非连续数组索引 slice ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60763445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com