go语言切片扩容出现问题 go 切片append( 三 )


空切片:
创建的指针不为空 , len和cap为空
当一个切片的容量满了,就需要扩容了 。怎么扩,策略是什么go语言切片扩容出现问题?
如果原来数组切片的容量已经达到了最大值 , 再想扩容,Go 默认会先开一片内存区域,把原来的值拷贝过来,然后再执行 append() 操作 。这种情况对现数组的地址和原数组地址不相同 。
从上面结果我们可以看到,如果用 range 的方式去遍历一个切片,拿到的 Value 其实是切片里面的值拷贝,即浅拷贝 。所以每次打印 Value 的地址都不变 。
由于 Value 是值拷贝的,并非引用传递,所以直接改 Value 是达不到更改原切片值的目的的 , 需要通过 slice[index] 获取真实的地址 。
go切片扩容出新数组地址与旧数组地址是不是不一样地址是一样的 。不过传指针会有一个弊端,从打印结果可以看到,指针地址都是同一个,万一原数组的指针指向更改了,那么函数里面的指针指向都会跟着更改 。同样的将数组转换为切片,通过传递切片,地址是不一样的 。
go语言循环队列的实现队列的概念在 顺序队列 中,而使用循环队列的目的主要是规避假溢出造成的空间浪费 , 在使用循环队列处理假溢出时,主要有三种解决方案
本文提供后两种解决方案 。
顺序队和循环队列是一种特殊的线性表,与顺序栈类似,都是使用一组地址连续的存储单元依次存放自队头到队尾的数据元素,同时附设队头(front)和队尾(rear)两个指针,但我们要明白一点,这个指针并不是指针变量,而是用来表示数组当中元素下标的位置 。
本文使用切片来完成的循环队列,由于一开始使用三个参数的make关键字创建切片 , 在输出的结果中不包含nil值(看起来很舒服),而且在验证的过程中发现使用append()函数时切片内置的cap会发生变化,在消除了种种障碍后得到了一个四不像的循环队列,即设置的指针是顺序队列的指针,但实际上进行的操作是顺序队列的操作 。最后是对make()函数和append()函数的一些使用体验和小结 , 队列的应用放在链队好了 。
官方描述(片段)
即切片是一个抽象层,底层是对数组的引用 。
当我们使用
构建出来的切片的每个位置的值都被赋为interface类型的初始值nil,但是nil值也是有大小的 。
而使用
来进行初始化时,虽然生成的切片中不包含nil值,但是无法通过设置的指针变量来完成入队和出队的操作,只能使用append()函数来进行操作
在go语言中,切片是一片连续的内存空间加上长度与容量的标识,比数组更为常用 。使用 append 关键字向切片中追加元素也是常见的切片操作
正是基于此,在使用go语言完成循环队列时 , 首先想到的就是使用make(type, len, cap)关键字方式完成切片初始化,然后使用append()函数来操作该切片,但这一方式出现了很多问题 。在使用append()函数时,切片的cap可能会发生变化,用不好就会发生扩容或收缩 。最终造成的结果是一个四不像的结果 , 入队和出队操作变得与指针变量无关,失去了作为循环队列的意义,用在顺序队列还算合适 。
参考博客:
Go语言中的Nil
Golang之nil
Go 语言设计与实现
关于go语言切片扩容出现问题和go 切片append的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

推荐阅读