设为首页 加入收藏

TOP

golang中的切片(二)
2023-07-23 13:29:45 】 浏览:46
Tags:golang
8----s2:[8 6],len(s2):2,cap(s2):7

我们可以看到s2[1]的元素写进去了,长度变为2。但是s2的长度并没有变化,s2[2]的元素却被修改为了6。这是因为往s2插入元素时并没有超过s2的容量,所以还是共用同一个底层数组。

那现在我们继续往s2中添加6个元素,看看超出容量后的底层数组会是什么样的:

package main

import "fmt"

func main() {
	s := make([]int, 2, 4)
	s[1] = 1
	s = append(s, 2)
	s = append(s, 1, 2, 3)
	s2 := s[1:2]
	s2[0] = 8
	s2 = append(s2, 6)
	// 继续插入6个元素
	s2 = append(s2, 7)
	s2 = append(s2, 8)
	s2 = append(s2, 9)
	s2 = append(s2, 10)
	s2 = append(s2, 11)
	s2 = append(s2, 12)
	fmt.Printf("继续往s2插入6个元素:s:%v,len(s):%d,cap(s):%d----s2:%v,len(s2):%d,cap(s2):%d\n",
		s, len(s), cap(s), s2, len(s2), cap(s2))
}
go run 4.go
继续往s2插入6个元素:s:[0 8 6 7 8 9],len(s):6,cap(s):8----s2:[8 6 7 8 9 10 11 12],len(s2):8,cap(s2):14

我们来分析下上面的例子:

  1. 当我们往s2插入7的时候,此时s2的长度变为3,容量还是7。s[3]对应也被修改。
  2. 当我们往s2插入8的时候,此时s2的长度变为4,容量还是7。s[4]对应也被修改。
  3. 当我们往s2插入9的时候,此时s2的长度变为5,容量还是7。s[5]对应也被修改。
  4. 当我们往s2插入10的时候,此时s2的长度变为6,容量还是7。s[6]对应也被修改。
  5. 当我们往s2插入11的时候,此时s2的长度变为7,容量还是7。因为s切片长度为6,所以没有变化。
  6. 当我们往s2插入12的时候,此时s2超过s2的容量引发扩容,底层数组被复制,s2指向一个新的容量为14的数组。因为s长度小于容量,所以还是指向原来的数组。

我们可以通过下面的图片,增加更清晰的认识。
http://image-1313007945.cos.ap-nanjing.myqcloud.com/image/1666278106.png

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇grpc错误处理 下一篇golang垃圾回收

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目