首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建非连续数组索引的切片

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

Stack Overflow用户
提问于 2020-03-19 18:57:01
回答 1查看 373关注 0票数 3

我在试着更好地理解切片。

例如,在Fortran中,如果我有一个2d数组,我可以使用matrix(:, (/2, 5, 9/))创建一个片。这个切片只包含第2行、第5行和第9行。我试图找到一种方法在Go中创建类似的切片。

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

代码语言:javascript
复制
var slice [][N]
slice = append(arr[1],arr[4],arr[8])

并且切片有正确的值,但是append复制值,所以如果我更新数组,那么我的切片就不会更新。

有什么合适的方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-19 19:08:50

引用规范:切片类型:

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

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

使用一段指针

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

代码语言:javascript
复制
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,然后我们看到更改的、更新的值。输出(在围棋游乐场上尝试):

代码语言:javascript
复制
[20 21 22] [50 51 52] [90 91 92] 
[66 21 22] [50 51 52] [90 91 92]

使用一片切片

切片(切片头)类似于指针:它们很小,结构类似于数据结构,其中包含指向片的第一个元素的指针,指向底层数组中的某个位置。有关详细信息,请参阅黄金片是通过价值传递的吗?为什么切片值有时会过时,但从不映射值?

因此,如果要使用切片而不是数组切片,那么它将在没有指针的情况下工作(片值已经包含指针)。

参见此示例:

代码语言:javascript
复制
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)

这将输出(在围棋游乐场上尝试它):

代码语言:javascript
复制
[[20 21 22] [50 51 52] [90 91 92]]
[[66 21 22] [50 51 52] [90 91 92]]

见相关问题:二维数组的内存表示方法

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60763445

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档