我可以恢复从切片开始处切掉的元素吗?

时间:2017-12-27 05:48:14

标签: go

a := []int{1,2,3,4,5,6}
b := a[1:len(a)-1]
fmt.Println(b) // -> [2 3 4 5]

我可以从6获取b

c := b[:len(b)+1]
fmt.Println(c) // -> [2 3 4 5 6]

但我可以回复1吗?

如果我尝试

c := b[-1:]

我得到了

  

无效的切片索引-1(索引必须是非负的)

如果我无法取回它,是否意味着它会被垃圾收集?

1 个答案:

答案 0 :(得分:0)

不会进行垃圾回收:Go Slices: usage and internals

如果您阅读this answer,它会向您展示如何使用反射来获取底层数组,使用不安全和反射包可以从中恢复1。

s := []int{1, 2, 3, 4}
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&s))
data := *(*[4]int)(unsafe.Pointer(hdr.Data))