golang中的slice使用时应该注意什么 @ 胡巴 | 星期日,三月 10 日,2024 年 | 3 分钟阅读 | 更新于 星期日,三月 10 日,2024 年

Go语言中的slice是一种灵活且强大的内置数据类型,它提供了比数组更灵活的内存抽象。然而,在使用slice时,有一些关键点需要注意以避免常见的问题和错误。本文将讨论在使用Go语言的slice时应注意的事项。

slice的基本概念

slice是Go语言中一种轻量级的数据结构,它包含三个字段:一个指向底层数组的指针、slice的长度以及容量。长度是slice中元素的数目,而容量是从slice的开始到其底层数组末尾的元素数目。

注意事项

  1. slice的扩容机制:当slice追加元素时,如果超过了其容量,Go语言会创建一个新的底层数组,并将原有元素和新元素复制到新数组中。因此,如果预先知道slice将增长到很大,最好一开始就分配足够大的容量以避免不必要的内存分配和复制。
  2. slice的共享内存:多个slice可以共享同一底层数组。这意味着对一个slice的修改可能会影响到其他共享同一底层数组的slice。在编写代码时,要注意这种情况,以避免意外的副作用。
  3. nil和空slice:nil slice没有底层数组,而空slice有底层数组但长度为0。两者在行为上有区别,例如,向nil slice追加元素会触发内存分配,而向空slice追加元素则不会。
  4. slice的迭代:在迭代slice时,应该避免使用索引来直接访问元素,因为这可能会导致数组越界。相反,应该使用range循环,它会在每次迭代时提供元素的副本,从而更加安全。
  5. slice的内存泄漏:如果程序中创建了大量的slice,并且这些slice指向大型底层数组的一部分,那么即使不再需要这些slice,底层数组也可能不会被垃圾回收。这可能导致内存泄漏。要避免这种情况,可以考虑使用copy函数或者创建新的slice来断开与原数组的关系。
  6. slice的传递和返回:在函数间传递slice时,应注意slice本身是引用类型,这意味着函数内部对slice的修改会影响到调用者看到的slice。如果不想改变原slice,可以在函数内部创建一个新的slice。

最佳实践

  • 使用make初始化slice时,提供明确的长度和容量。
  • 在可能的情况下,预先分配足够的容量以减少扩容操作。
  • 避免在不必要的情况下创建slice的slice,因为这会增加内存使用和复杂性。
  • 在并发环境中,要注意slice的同步访问,以避免竞态条件。

了解slice的工作原理和注意事项,可以帮助您更有效地使用Go语言编写清晰、高效的代码。

捐赠

感谢老板请我喝杯咖啡!Thank you for buying me a coffee!

WeChat AliPay PayPal
wechatpay alipay PayPal

公众号: 无限递归

alt 搜索公众号:无限递归

Copyright © 2017 - 2024 boboidea.com All Rights Reserved 波波创意软件工作室 版权所有 【转载请注明出处】

avatar
基本信息
  • 姓名:bobo
  • 花名:胡巴
  • 性别:男
  • 血型:O型
  • 星座:白羊座

联系方式

  • 所在地:上海
  • QQ:279250819
  • 微信号:wanghuiwoshinideyou
  • 电子邮件:279250819@qq.com

博客地址

公众号

alt 无限递归

工作经历
  • 2022.5 - 至今

    • 公司:乐府互娱
    • 职位:高级SDK工程师
  • 2019.6 - 2022.4

    • 公司:萌推(上海突进网络科技有限公司)
    • 职位:中级PHP工程师 & 初级golang工程师
    • 荣誉:
      • 绩效A连续得主
      • 月度之星
      • 优秀个人奖
    • 所作所为:
      • 利用ES优化OMS、MMS管理系统商品列表查询
      • 利用消息队列、Redis、乐观锁优化商品审核流程
      • 利用Redis对商家端接口进行有效限流
      • 优化商品相关表索引,提升SQL查询速度
      • 商品中台构建,统一商品相关操作
      • 大表优化(数据分离、分表、大字段拆分)
      • 掌握所有商品核心流程
  • 2018.5 - 2019.5

    • 公司:DaDa英语(上海卓赞教育信息科技有限公司)
    • 职位:中级PHP开发工程师
    • 荣誉:无
    • 所作所为:
      • 利用ES优化教师CMS系统统计数据接口至500ms内
      • 工单系统开发及持续优化
      • 教师CMS系统的功能开发及持续优化
  • 2018.3 - 2018.5

    • 公司:波奇(上海)信息科技有限公司
    • 职位:初级PHP开发工程师
    • 荣誉:同下
    • 所做作为:如下
  • 2016.7 - 2018.3

    • 公司:光橙(上海)信息科技有限公司
    • 职位:初级PHP开发工程师
    • 荣誉:
      • 年度最佳进步奖
    • 所作所为:
      • 利用Redis提升商详接口最佳响应速度至50ms内
      • 利用Redis提升双11活动页可承受QPS至500以上
      • 利用Redis对接口进行简单限流
      • 与小伙伴合作提升搜索质量(ES初识)
      • 其他C端接口的开发及优化
      • B端商城老页面的维护及优化
SKILLS

编程语言

  • PHP
  • Golang
  • Shell
  • JAVA
  • JS
  • HTML\CSS

数据库

  • MySQL
  • Redis
  • Clickhouse

消息中间件

  • RabbitMq
  • Kafka

文档撰写

  • Swagger
  • Markdown

技术框架

  • Laravel
  • gin

搜索引擎

  • ElasticSearch

抓包工具

  • Charles