分享
  1. 首页
  2. 文章

golang slice

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

#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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏