当前位置: 首页 > news >正文

golang 数组和切片

区别
1.数组长度固定,切片长度可变
2.数组是深拷贝,切片是浅拷贝,切片是引用类型

扩容规则 不同版本不一样
https://www.jb51.net/article/280481.htm#_lab2_2_1

go1.18
1.如果期望容量大于当前容量的两倍就会使用期望容量;
2.如果当前切片的容量小于阈值(默认 256)就会将容量翻倍;
3.如果当前切片的容量大于等于阈值(默认 256),小切片的2倍生长,大切片生长1.25倍;

package mainimport "fmt"func main() {arr1 := [3]int{1, 2, 3}arr2 := arr1fmt.Printf("%p\n", &arr1[0])fmt.Printf("%p\n", &arr2[0])arr2[0] = 10fmt.Println(arr1)fmt.Println(arr2)sli1 := []int{1, 2}sli2 := sli1fmt.Printf("%p\n", &sli1[0])fmt.Printf("%p\n", &sli2[0])sli2[0] = 10fmt.Println(sli1)fmt.Println(sli2)sliceAppend(sli1)fmt.Println(sli1)
}// 不会改变原有slice长度
func sliceAppend(s []int) {s = append(s, []int{2, 2, 2}...)fmt.Printf("sliceAppend %d %d\n", len(s), len(s))
}
package mainimport "fmt"func main() {sli1 := []int{1}fmt.Printf("len=%d cap=%d\n", len(sli1), cap(sli1))// 期望容量大于当前容量的两倍sli1 = append(sli1, []int{2, 3, 4}...)fmt.Printf("len=%d cap=%d\n", len(sli1), cap(sli1))// 如果当前切片的容量小于阈值(默认 256)就会将容量翻倍sli1 = append(sli1, 1)fmt.Printf("len=%d cap=%d\n", len(sli1), cap(sli1))// 如果当前切片的容量大于等于阈值(默认 256),就会每次增加 25% 的容量/*//从小切片的2倍生长过渡//大切片生长1.25倍newcap += (newcap + 3*threshold) / 4*/sli2 := make([]int, 256, 256)fmt.Printf("len=%d cap=%d\n", len(sli2), cap(sli2))sli2 = append(sli2, 1)fmt.Printf("len=%d cap=%d\n", len(sli2), cap(sli2))for i := 0; i < 10; i++ {sli2 = append(sli2, sli2...)fmt.Printf("len=%d cap=%d\n", len(sli2), cap(sli2))}}

runtime/slice

type slice struct {array unsafe.Pointerlen   intcap   int
}func growslice(et *_type, old slice, cap int) slice {if raceenabled {callerpc := getcallerpc()racereadrangepc(old.array, uintptr(old.len*int(et.size)), callerpc, abi.FuncPCABIInternal(growslice))}if msanenabled {msanread(old.array, uintptr(old.len*int(et.size)))}if asanenabled {asanread(old.array, uintptr(old.len*int(et.size)))}if cap < old.cap {panic(errorString("growslice: cap out of range"))}if et.size == 0 {// append should not create a slice with nil pointer but non-zero len.// We assume that append doesn't need to preserve old.array in this case.return slice{unsafe.Pointer(&zerobase), old.len, cap}}newcap := old.capdoublecap := newcap + newcapif cap > doublecap {newcap = cap} else {const threshold = 256if old.cap < threshold {newcap = doublecap} else {// Check 0 < newcap to detect overflow// and prevent an infinite loop.for 0 < newcap && newcap < cap {// Transition from growing 2x for small slices// to growing 1.25x for large slices. This formula// gives a smooth-ish transition between the two.newcap += (newcap + 3*threshold) / 4}// Set newcap to the requested cap when// the newcap calculation overflowed.if newcap <= 0 {newcap = cap}}}
http://www.lryc.cn/news/333397.html

相关文章:

  • 物联网实战--入门篇之(九)安卓QT--开发框架
  • 【leetcode面试经典150题】16.接雨水(C++)
  • 互联网面经
  • xss介绍及作用
  • PostgreSQL入门到实战-第二弹
  • 3-【PS让图片动起来】系列1-【导入素材】
  • 基于Java+SpringBoot+Mybaties+layui+Vue+elememt 实习管理系统 的设计与实现
  • 非关系型数据库——Redis基本操作
  • golang语言和JAVA对比
  • 隐私计算实训营学习九:隐语多方安全计算在安全核对的行业实践
  • C#实现只保存2天的日志文件
  • C++ 类和对象(中篇)
  • 可视化场景(9):智慧看板,可能是最直观的数据展示
  • 加密算法(二)
  • 大创项目推荐 深度学习 YOLO 实现车牌识别算法
  • IP知识详解
  • 设计模式:适配器模式
  • 大语言模型落地的关键技术:RAG
  • ffmpeg Android 笔记
  • 本地创建新分支并提交gitee
  • [蓝桥杯 2019 国 C] 数正方形
  • Redis: 配置文件详解(Redis.conf)
  • 学习vue3第十四节 Teleport 内置组件介绍
  • mybatis模糊查询查不到数据
  • Python语法总结:not(常出现错误)
  • 深入理解WebSocket:实时双向通信的利器
  • Gateway是什么?(SpringCloudAlibaba组件)
  • 阿里巴巴拍立淘API新功能揭秘:图片秒搜商品,实现智能化个性化购物新体验
  • 蚓链为移动实体经济加油!
  • MySQL 核心模块揭秘 | 12 期 | 创建 savepoint