当前位置:网站首页>go记录之——slice
go记录之——slice
2022-07-31 16:37:00 【Meme_xp】
初片是基于数组实现的,它的底层是数组,可以理解为对底层数组的抽象。
源码包中src/runtime/slice.go定义了slice的数据结构:
type slice struct {
array unsafe.Pointer
len int
cap int
}
slice占用24个字节
array:指向底层数组的指针,占用8个字节
len:切片的长度,占用8个字节
cap:切片的容量,cap总是大于等于len 的,占用8个字节
len(slice)和cap(silce)大小是不一样的
slice有4种初始化方式
//初始化方式1:直接声明var slice1 []int
//初始化方式2:使用字面量
slice2 := []inti1,2,3,4}
//初始化方式3:使用make创建slice
slice3 := make( [ ]int,3,5)
//初始化方式4:从切片或数组“截取"
slcie4 := arr[1:3]
slice的深拷贝和浅拷贝
深拷贝∶拷贝的是数据本身,创造一个新对象,新创建的对象与原对象不共享内存,新创建的对象在内存中开辟一个新的内存地址,新对象值修改时不会影响原对象值
实现深拷贝的方式:
1.copy(slice2, slice1)
2.遍历append赋值
func main() {
slice1 := []int{
1,2,3,4,5}
slice2 := make( []int,5,5)
fmt.Printf(""slice1: %v,%p", slice1, slice1)
copy(slice2, slice1)
fmt.Printf(""slice2: %v,%p", slice2, slice2)
slice3 := make( []int, 0,5)
for _, v := range slice1{
slice3 = append(slice3,v)
}
fmt.Printf(""slice3:%v,%sp",slice3, slice3)
}
slice1: [1 2 34 5], oxce000b0030
slice2: [1 2 34 5], oxc0000b0060
slice3: [1 2 3 4 5],oxc0000b0090
浅拷贝︰拷贝的是数据地址,只复制指向的对象的指针,此时新对象和老对象指向的内存地址是一样的,新对象值修改时老对象也会变化
实现浅拷贝的方式:
1.引用类型的变量,默认赋值操作就是浅拷贝
slice2=slice1
2.传参数的时候
slice扩容机制
扩容会发生在slice append的时候,当slice的cap不足以容纳新元素,就会进行扩容,扩容规则如下
1.扩容为2倍的时候会申请新的空间
2.如果原有slice长度小于1024,那么每次就扩容为原来的2倍
3.如果原 slice长度大于等于1024,那么每次扩容就扩为原来的1.25倍
slice为什么不是线程安全
先看下线程安全的定义:
多个线程访问同一个对象时,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
再看Go语言实现线程安全常用的几种方式:
1.互斥锁
2.读写锁
3.原子操作
4. sync.once
5.sync.atomic
6.channel
slice底层结构并没有使用加锁等方式,不支持并发读写,所以并不是线程安全的,使用多个gorcutine对类型为 slice的变量进行操作,每次输出的值大概率都不会一样,与预期值不一致; slice在并发执行中不会报错,但是数据会丢失
边栏推荐
- [TypeScript]OOP
- 【C语言】LeetCode27.移除元素
- 无主复制系统(3)-Quorum一致性的局限性
- 使用 Postman 工具高效管理和测试 SAP ABAP OData 服务的试读版
- Flex布局详解
- Huawei's top engineers lasted nine years "anecdotal stories network protocol" PDF document summary, is too strong
- LeetCode_733_图像渲染
- 动态规划之线性dp(上)
- 【pytorch】pytorch 自动求导、 Tensor 与 Autograd
- Masterless replication system (2) - read and write quorum
猜你喜欢
华为顶级工程师历时9年总结的“趣谈网络协议”PDF文档,太强了
C language - function
.NET 20th Anniversary Interview - Zhang Shanyou: How .NET technology empowers and changes the world
[Network Communication 3] Advantech Gateway Modbus Service Settings
selenium的常见方法及使用
基于C语言的编译器设计与实现
Huawei's top engineers lasted nine years "anecdotal stories network protocol" PDF document summary, is too strong
adb shell 报错error: device unauthorized
Intelligent bin (9) - vibration sensor (raspberries pie pico implementation)
[TypeScript] In-depth study of TypeScript type operations
随机推荐
Implementing DDD based on ABP
The 2nd China PWA Developer Day
基于Redis(SETNX)实现分布式锁,案例:解决高并发下的订单超卖,秒杀
GP 6总体架构学习笔记
最新神作!阿里巴巴刚出炉的面试参考指南(泰山版),我直接狂刷29天
npm安装时卡在sill idealTree buildDeps,npm安装速度慢,npm安装卡在一个地方不动
【TypeScript】深入学习TypeScript类型操作
Website vulnerability repair service provider's analysis of unauthorized vulnerability
基于C语言的编译器设计与实现
Graham‘s Scan法求解凸包问题
[TypeScript] In-depth study of TypeScript type operations
After the form is submitted, the page does not jump [easy to understand]
Qt practical cases (54) - using transparency QPixmap design pictures
Masterless replication system (2) - read and write quorum
SringMVC中个常见的几个问题
Stuck in sill idealTree buildDeps during npm installation, npm installation is slow, npm installation is stuck in one place
动态规划之线性dp(上)
组合学笔记(六)局部有限偏序集的关联代数,Möbius反演公式
AcWing 1282. 搜索关键词 题解((AC自动机)Trie+KMP)+bfs)
动态规划之线性dp(下)