热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【go源码分析】go源码之slice源码分析

【go源码分析】go源码之slice源码分析,Go语言社区,Golang程序员人脉社

Go 语言切片是对数组的抽象。

Go 数组的长度不可改变,与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。

len() 和 cap() 函数

    切片是可索引的,并且可以由 len() 方法获取长度。

    切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。

空(nil)切片

    一个切片在未初始化之前默认为 nil,长度为 0

结构体

  slice结构体

    一个指向array地址的指针,slice的长度len和容量cap

type slice struct {
	array unsafe.Pointer
	len   int
	cap   int
}

1. makeslice函数

    调用mallocgc分配连续的地址

func makeslice(et *_type, len, cap int) slice {
	// NOTE: The len > maxElements check here is not strictly necessary,
	// but it produces a 'len out of range' error instead of a 'cap out of range' error
	// when someone does make([]T, bignumber). 'cap out of range' is true too,
	// but since the cap is only being supplied implicitly, saying len is clearer.
	// See issue 4085.
	maxElements := maxSliceCap(et.size)
	if len <0 || uintptr(len) > maxElements {
		panicmakeslicelen()
	}

	if cap  maxElements {
		panicmakeslicecap()
	}

	p := mallocgc(et.size*uintptr(cap), et, true)
	return slice{p, len, cap}
}
2. growslice函数

    slice扩大容量函数,这块可以看出来怎么增长容量

  •     <1024,按照两倍增长
  •     否则按照1.25倍增长
  •     扩容会涉及数据拷贝,产生性能开销
	newcap := old.cap
	doublecap := newcap + newcap
	if cap > doublecap {
		newcap = cap
	} else {
		if old.len <1024 {
			newcap = doublecap
		} else {
			// Check 0 

推荐阅读
author-avatar
良心無悔1314_878
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有