摘要: 1> 创建slice时 应根据实际需求 分配容量 避免追加过程中 频繁扩容 有助于提升性能 2> slice并非并发安全的 如果要实现并发安全 需要借助与 锁 或者 channel 3> 大数组作为函数参数时 会复制整个数组 消耗过多内存 建议采用slice 或者数组指针的方式传递 4> 如果只用到 阅读全文
posted @ 2023-02-01 17:15 幸福捕手 阅读(16) 评论(0) 推荐(0) 编辑
摘要: slice并不是并发安全的 要想并发安全 有两种实现方式: 1> 加锁:适合对性能要求不高的场景实现 这种方式属于共享内存 来实现通信 2> channel:适合对性能要求较高的场景 这种方式属于 通过通信来共享内存 阅读全文
posted @ 2023-02-01 17:15 幸福捕手 阅读(33) 评论(0) 推荐(0) 编辑
摘要: 当slice A 的底层数组B很大 但是A的引用很小时 此时底层数组B的大部分空间是被浪费的 只要A还存在 底层数组B就永远不会被回收 这就回造成内存泄漏 var a []int func test(b []int) { a = b[:1] // 和b共用一个底层数组 return } 解决方法: 阅读全文
posted @ 2023-02-01 17:15 幸福捕手 阅读(17) 评论(0) 推荐(0) 编辑
摘要: 1> 浅拷贝:只是复制指向对象的指针 公用相同的底层数组 任何一个数组元素的改变 都会影响到双方 赋值方式 slice1 := slice2 (浅拷贝 地址复制) 2> 深拷贝:拷贝的是数据本身 是值拷贝 会创建一个新的对象 新对象和原始对象 不共享内存 赋值方式: copy(slice2, sli 阅读全文
posted @ 2023-02-01 17:13 幸福捕手 阅读(14) 评论(0) 推荐(0) 编辑
摘要: 1> 切片的容量小于1024 扩容后直接翻倍 2> 切片的容量大于1024 每次扩容为原来的1/4 3> 如果扩容后 slice的长度 还是小于原始底层数组 则slice指针仍指向原始底层数组 此时所有的修改 仍会影响原始底层数组的值 4> 如果扩容后 slice的长度 超出原始底层数组 则会新开辟 阅读全文
posted @ 2023-02-01 17:13 幸福捕手 阅读(48) 评论(0) 推荐(0) 编辑
摘要: 1> slice本身并不是一个动态数组或者数组指针 他的内部实现是通过指针引用底层数组,设置相关的属性,将数据的读写操作限定在指定的区域内 2> 所有对slice的修改 改动的都是底层数组 而不是slice本身 其工作方式 类似于数组指针的一种封装 3> slice是对数组中一个连续片段的引用 所以 阅读全文
posted @ 2023-02-01 17:12 幸福捕手 阅读(29) 评论(0) 推荐(0) 编辑