我在试着更好地理解切片。
例如,在Fortran中,如果我有一个2d数组,我可以使用matrix(:, (/2, 5, 9/))创建一个片。这个切片只包含第2行、第5行和第9行。我试图找到一种方法在Go中创建类似的切片。
我知道我可以像这样使用附录:
var slice [][N]
slice = append(arr[1],arr[4],arr[8])并且切片有正确的值,但是append复制值,所以如果我更新数组,那么我的切片就不会更新。
有什么合适的方法吗?
发布于 2020-03-19 19:08:50
引用规范:切片类型:
片是基础数组的连续段的描述符,并提供对该数组中元素的编号序列的访问。
切片总是表示基础数组的连续段,不能在开始索引和结束索引之间跳过元素。
使用一段指针
您可以用指针来模拟这种行为,但是它们将是指针,有它们的所有优点和缺点。例如:
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,然后我们看到更改的、更新的值。输出(在围棋游乐场上尝试):
[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] = 66
fmt.Println(s2)这将输出(在围棋游乐场上尝试它):
[[20 21 22] [50 51 52] [90 91 92]]
[[66 21 22] [50 51 52] [90 91 92]]见相关问题:二维数组的内存表示方法
https://stackoverflow.com/questions/60763445
复制相似问题