为了账号安全,请及时绑定邮箱和手机立即绑定

如何创建非连续数组索引切片

如何创建非连续数组索引切片

Go
月关宝盒 2023-08-21 14:31:51
我试图更好地理解切片。例如,在 Fortran 中,如果我有一个二维数组,我可以使用matrix(:, (/2, 5, 9/)). 该切片仅包含第 2、5 和 9 行。我正在尝试找到一种在 Go 中创建类似切片的方法。我知道我可以像这样使用附加:var slice [][N] slice = append(arr[1],arr[4],arr[8])并且切片具有正确的值,但append会复制这些值,因此如果我更新数组,我的切片不会更新。在 Go 中是否有正确的方法来做到这一点?
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

引用规范:切片类型:

切片是底层数组的连续段的描述符,并提供对该数组中元素的编号序列的访问。

切片始终表示基础数组的连续段,不能在开始索引和结束索引之间跳过元素。

使用指针切片

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

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]

使用切片的切片

切片(切片头)与指针类似:它们是小型的类似结构的数据结构,其中包含指向切片第一个元素的指针,指向底层数组中的某个位置。

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

看这个例子:

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] = 66fmt.Println(s2)

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

[[20 21 22] [50 51 52] [90 91 92]]
[[66 21 22] [50 51 52] [90 91 92]]
查看完整回答
反对 回复 2023-08-21
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信