当前位置:网站首页>Go record - slice
Go record - slice
2022-07-31 16:52:00 【Meme_xp】
The first slice is implemented based on an array,它的底层是数组,可以理解为对底层数组的抽象.
源码包中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.引用类型的变量,The default assignment operation is a shallow copy
slice2=slice1
2.传参数的时候
slice扩容机制
扩容会发生在slice append的时候,当slice的cap不足以容纳新元素,就会进行扩容,扩容规则如下
1.扩容为2Times will apply for new space
2.如果原有slice长度小于1024,那么每次就扩容为原来的2倍
3.如果原 slice长度大于等于1024,那么每次扩容就扩为原来的1.25倍
slice为什么不是线程安全
Let's first look at the definition of thread safety:
多个线程访问同一个对象时,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的.若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全.
再看GoThere are several common ways that languages implement thread safety:
1.互斥锁
2.读写锁
3.原子操作
4. sync.once
5.sync.atomic
6.channel
sliceThe underlying structure does not use methods such as locking,不支持并发读写,所以并不是线程安全的,使用多个gorcutine对类型为 slice的变量进行操作,每次输出的值大概率都不会一样,与预期值不一致; slice在并发执行中不会报错,但是数据会丢失
边栏推荐
- 最新神作!阿里巴巴刚出炉的面试参考指南(泰山版),我直接狂刷29天
- [pytorch] pytorch automatic derivation, Tensor and Autograd
- 多主复制下处理写冲突(3)-收敛至一致的状态及自定义冲突解决逻辑
- 牛客 HJ17 坐标移动
- 牛客网刷题(三)
- A common method and the use of selenium
- 【luogu P8326】Fliper (Graph Theory) (Construction) (Eulerian Circuit)
- Three aspects of Ali: How to solve the problem of MQ message loss, duplication and backlog?
- 宁波大学NBU IT项目管理期末考试知识点整理
- Graham‘s Scan法求解凸包问题
猜你喜欢
动态规划(一)
Huawei's top engineers lasted nine years "anecdotal stories network protocol" PDF document summary, is too strong
杰理语音芯片ic玩具芯片ic的介绍_AD14NAD15N全系列开发
How C programs run 01 - the composition of ordinary executable files
2022年整理LeetCode最新刷题攻略分享(附中文详细题解)
Go1.18升级功能 - 模糊测试Fuzz 从零开始Go语言
基于C语言的编译器设计与实现
.NET 20th Anniversary Interview - Zhang Shanyou: How .NET technology empowers and changes the world
21.支持向量机—核函数的介绍
C language - function
随机推荐
useragent在线查找
A common method and the use of selenium
How C programs run 01 - the composition of ordinary executable files
Kotlin协程:续体、续体拦截器、调度器
Three aspects of Ali: How to solve the problem of MQ message loss, duplication and backlog?
最后写入胜利(丢弃并发写入)
杰理语音芯片ic玩具芯片ic的介绍_AD14NAD15N全系列开发
【码蹄集新手村600题】不通过字符数组来合并俩个数字
牛客 HJ3 明明的随机数
新型电信“套路”,我爸中招了!
【愚公系列】2022年07月 Go教学课程 020-Go容器之数组
[pytorch] 1.7 pytorch and numpy, tensor and array conversion
牛客 HJ19 简单错误记录
【网络通信三】研华网关Modbus服务设置
selenium的常见方法及使用
你辛辛苦苦写的文章可能不是你的原创
Masterless replication system (1) - write DB when node fails
【luogu P8326】Fliper(图论)(构造)(欧拉回路)
智能垃圾桶(八)——红外对管传感器(树莓派pico)
IP协议从0到1