golang slice

1071954237 · · 9186 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

#slice append 实现 s2 := append(s1, *) 切片s1上记录的切片信息复制给s2,

1.如果s1指向的底层array长度不够,append的过程会发生如下操作:内存中不仅新开辟一块区域存储append后的切片信息,而且需要新开辟一块区域存储底层array(复制原来的array至这块新array中),最后再append新数据进新array中,这样,s2指向新array。

2.如果s1指向的底层array长度够, s2和s1指向同一个array,append的结果是内存中新开辟一个区域存储新切片信息。

开辟一块区域存储底层array 使用下面的策略: 1.如果 增加的 len < s的cap 则 新s的cap*2 2.如果 增加的 len > s的cap 则 新s的cap = 老cap + 增加数据的 len #测试slice和list性能


package main

import (
	l "container/list"
	"fmt"
	"time"
)

var (
	name = "viney"
)

func list() {
	names := l.New()
	t := time.Now()
	for i := 1; i <= 10000000; i++ {
		_ = names.PushFront(name)
	}
	fmt.Println("list: " + time.Now().Sub(t).String())
}

func slice() {
	names := make([]string, 0, 1)

	t := time.Now()
	fmt.Println("init cap: ", cap(names))
	for i := 1; i <= 10000000; i++ {
		names = append(names, name)
	}
	fmt.Println("slice: " + time.Now().Sub(t).String())
	fmt.Println("new cap: ", cap(names))
}

func main() {
	slice()
	list()
}


output
init cap:  1
slice: 2.4239847s
new cap:  10350080
list: 1.9973994s

有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:1071954237

查看原文:golang slice

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

9186 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传