首页 > 其他分享 >切片

切片

时间:2023-07-15 10:23:04浏览次数:27  
标签:扩容 1024 newcap int fmt cap 切片

结构体定义

runtime/slice.go文件中

type slice struct {
	array unsafe.Pointer // 数组的指针
	len   int
	cap   int
}

扩容

通过append方法添加数据,返回一个新的slice对象,地址和之前不一样。但是原来元素地址是不变的,直到扩容。

package main

import (
	"fmt"
)

func main() {
	a := make([]int, 1, 2)
	b := append(a, 10)
	fmt.Println(&a == &b) // 变量地址肯定不同,false
	fmt.Println(&a[0] == &b[0]) // true
}

扩容流程

newcap := old.cap
doublecap := newcap + newcap
//这个cap为old.cap+新加元素数量
if cap > doublecap {
	newcap = cap
} else {
	if old.len < 1024 {
		newcap = doublecap
	} else {
		for newcap < cap {
			newcap += newcap / 4
		}
	}
}

cap是老数组的容量+新加元素数量,即扩容的最小值
如果两倍扩容达不到cap,那么新数组的容量就是这个cap
如果两倍扩容达到了cap,那么根据老数组元素数量是否小于1024来决定扩容容量
1. 如果小于1024,那么正常扩容两倍。
2. 如果大于等于1024,那么循环扩容1.25倍,直到达到或者超过cap,最终结果是扩容值。
之后,通过内存对齐得到最终的容量值。

举个例子

package main

import "fmt"

func main() {
	s := []int{1,2}
	s = append(s,4,5,6)
	fmt.Printf("%d %d",len(s),cap(s))
}

结果是5,6

标签:扩容,1024,newcap,int,fmt,cap,切片
From: https://www.cnblogs.com/WJQ2017/p/17555681.html

相关文章

  • go 给一个切片,将其写入到一个单链表中
    packagemainimport"fmt"//功能:实现一个单链表(给一个切片,将其写入到一个单链表中)typeNodestruct{ValueintNext*Node}funccreate(slice[]int)*Node{iflen(slice)==0{returnnil}node:=new(Node)node.Value=sl......
  • golang中的空切片和nil切片
    Golang中的切片是很基本的数据结构,它的底层是一个数组,表层是一个包含三个变量的结构体:typeslicestruct{arrayunsafe.Pointer //指针,指向底层的数组lengthint //切片的长度capcityint //切片的容量}当把一个切片赋值给另一个切片时,实际上是对切片表层结构体的浅......
  • go 传参 类型:接口类型 返回统配接口类型 , 求两个切片并集
     用一个函数可以同时求两个[]string 切片,或者两个[]int切片并集packagemain//测试统配传参funccommonParamTest(s1,s2interface{})interface{}{switchv:=s1.(type){//获取对应的类型case[]string:m:=make(map[string]int)......
  • 切片
    #切片list=[0,1,2,3,4]result=list[1:4]#包头1不包尾4print(result)#1,2,3 默认值    起:0   结束:len(list) ;list 或者tuple字符串的长度#切片从头到尾的时候可以不写list=[0,1,2,3,4]reslut=list[:]#全部print(reslut) 步长 ......
  • go:数组和切片、可变长参数、maps、字符串、指针、结构体、方法、接口
    目录数组和切片数组切片可变长参数maps字符串指针结构体方法接口数组和切片数组#1定义,初始化,使用#2数组是值类型数字,字符串,布尔,数组,都是值类型,真正直接存数据切片,map,指针引用类型,是个地址,指向了具体的值#3数组长度#4循环打印数组#5多纬数组#......
  • PS 切片工具的使用
    PS切片,快速将图象切成N个小图象,节省时间。 第一步:使用“标尺”,拉“参考线”,能够方便于“切片”。在“视图”的“标尺”上打勾,在鼠标坐标上下拉就可以出现“参考线” 第二步:选择“切片工具”,开始切图 第三步:按“Shift+Alt+Ctrl+S”就可以弹出该窗口,保存指定的格式,点击“存储” ......
  • 切片
    切片的格式:对象名[start......
  • Go-map、切片、数组循环常见问题总结
    map1、forrangemap在开始执行循环的时候,底层做了随机种子,故其循环是随机的。packagemainimport"fmt"funcmain(){ a:=map[int]int{0:1,1:2,2:3,3:4,4:5} for_,c:=rangea{ fmt.Println(c) }}输出:34512多次执行,结果不同数组packagema......
  • StringPtr StringPtrs 字符串指针 字符串指针切片
    funcBoolPtr(vbool)*bool{  return&v}funcStringPtr(vstring)*string{  return&v} funcStringPtrs(vals[]string)[]*string{  ptrs:=make([]*string,len(vals))  fori:=0;i<len(vals);i++{    ptrs[i]=&v......
  • 15-1 shell脚本编程进阶字符串切片和高级变量
    一、显示字符的长度[root@centos8~]#str=`echo{a..z}|tr-d''`[root@centos8~]#echostrstr[root@centos8~]#echo$strabcdefghijklmnopqrstuvwxyz[root@centos8~]#name=刘进喜[root@centos8~]#echo${#name}3[root@centos8~]#echo${#str}26二、切片roo......