对切片删除操作的一些疑问?
问题描述:
切片的底层是一个数组指针对象,根据官网博客 Go Slices: usage and internals - The Go Blog (golang.org) 的介绍,没整明白下方代码(如截图)
我的疑问:
1、为什么删除头部元素的时候其容量会发生改变呢?
2、切片的底层也会一个数组,那么其内存地址也应该是连续的才对,我删除中间的元素此时的内存地址不应该是断裂了会开辟一个新的连续内存空间来存放吗(就跟切片扩容一样),但实际这里我验证后,我的理解是错误的。
相关代码:
package main
import "fmt"
func main() {
fmt.Println("======切片删除测试:slice[i:x]========")
slice := []int{-5,-4,-3,-2,-1,0, 1, 2, 3, 4}
fmt.Printf("源切片:%v len:%d cap:%d ptr:%p slice[1]:%p\n", slice, len(slice), cap(slice), slice, &slice[1])
fmt.Println("==========删除尾部元素================")
slice = slice[:len(slice)-1]
fmt.Printf("删除尾部:%v len:%d cap:%d ptr:%p slice[1]:%p\n", slice, len(slice), cap(slice), slice, &slice[1])
fmt.Println("==========删除头部元素================")
slice = slice[1:]
fmt.Printf("删除头部:%v len:%d cap:%d ptr:%p\n", slice, len(slice), cap(slice), slice)
fmt.Println("==========删除中间元素================")
center := int(len(slice)/2)
slice = append(slice[:center], slice[center+1:]...)
fmt.Printf("删除中间:%v len:%d cap:%d ptr:%p\n", slice, len(slice), cap(slice), slice)
}
尝试过的解决方式:
1、我看了 runtime/slice.go 中的源码,貌似没有找到关于删除操作对应的代码(感觉我应该是找错了)
2、使用了 dlv 来 debug,还不是很熟练也没 debug 出什么东西
3、通过 google 查了 `golang slice delete first element cap changed` 翻了几篇文章,没有找到对应的答案
18
收起
正在回答 回答被采纳积分+1
1回答
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星