切片初始化

news/2025/2/27 10:34:58/文章来源:https://www.cnblogs.com/maidongdong/p/18740403

详细对比一下 s := make([]int, 0, 5)var s []int 的区别,以及它们是否算作初始化的情况。

1. s := make([]int, 0, 5)

  • 含义:使用 make 创建一个切片,类型是 []int,长度(length)为 0,容量(capacity)为 5。
  • 底层实现:分配了一个容量为 5 的底层数组,但当前长度为 0,意味着切片中暂时没有可访问的元素。
  • 初始状态:切片不是 nil,已经分配了内存,初始值是空的([]),但可以直接使用,比如通过 append 添加元素。
  • 验证代码
    s := make([]int, 0, 5)
    fmt.Println(s)         // 输出: []
    fmt.Println(len(s))    // 输出: 0
    fmt.Println(cap(s))    // 输出: 5
    fmt.Println(s == nil)  // 输出: false
    s = append(s, 1)       // 正常工作,s 变成 [1]
    
  • 是否初始化:是的,这是一种初始化方式。内存已经分配,切片处于可操作状态,只是长度为 0。

2. var s []int

  • 含义:声明一个切片变量 s,类型是 []int,但没有显式分配内存或赋值。
  • 底层实现:没有分配底层数组,s 的值是 nil,表示一个空切片。
  • 初始状态:切片是 nil,没有预分配空间,不能直接通过索引赋值(如 s[0] = 1 会 panic),但可以用 append 操作,因为 append 会自动处理内存分配。
  • 验证代码
    var s []int
    fmt.Println(s)         // 输出: []
    fmt.Println(len(s))    // 输出: 0
    fmt.Println(cap(s))    // 输出: 0
    fmt.Println(s == nil)  // 输出: true
    s = append(s, 1)       // 正常工作,s 变成 [1]
    
  • 是否初始化:严格来说,这不算完整的初始化。虽然声明了变量并赋予了默认值(nil),但没有分配内存,切片还不能直接用于所有操作(比如索引赋值)。

主要区别

特性 s := make([]int, 0, 5) var s []int
长度 0 0
容量 5 0
是否 nil
内存分配 已分配(容量 5) 未分配
初始值 [](空的非 nil 切片) nil
使用场景 预留空间,减少扩容开销 简单声明,延迟分配

哪个初始化了?

  • s := make([]int, 0, 5):明确初始化了。它分配了内存,设置了长度和容量,切片处于完全可用的状态。
  • var s []int:没有完全初始化。虽然它被声明并默认赋值为 nil,但没有分配底层数组,功能上受到限制(比如不能直接通过索引操作)。在 Go 中,这种情况通常被视为“零值初始化”,但不是切片完整的初始化。

使用建议

  • 如果你知道切片会频繁追加元素,且想减少底层数组扩容的性能开销,用 make([]int, 0, 5) 预分配容量更合适。
  • 如果只是简单声明一个切片,暂时不需要内存分配,var s []int 就够了,之后可以用 append 动态扩展。

希望这个对比清楚地解答了你的疑问!还有什么想深入了解的吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890520.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纷享销客CRM全面评测:纷享销客比销售易差异化对比

企业数字化转型热潮中,CRM是众多企业迈向数字化管理的里程碑。近年来,国产CRM在政策推动下成为大中型企业的首选,也有很多企业选择国产CRM替代国外供应商。国产CRM第一梯队中,纷享销客以其卓越的表现脱颖而出,稳坐头把交椅。IDC发布了最新数据报告《IDC China Semiannual …

ABB机器人平衡缸维修

在现代工业生产中,工业机器人扮演着至关重要的角色。其中,ABB机器人以其高精度、高可靠性而被广泛应用。然而,如同所有机械设备一样,ABB机器人也会出现故障,这就需要专业的维修。一、ABB机器人故障与平衡缸维修的重要性ABB机器人故障的出现会严重影响生产进程。机器人平衡…

python打包工具-Nuitka

nuitka将python源码转成C++(这里得到的是二进制的pyd文件,防止了反编译),然后再编译成可执行文件。提高安全性和运行速度。 github:https://github.com/2267770481/cython_test 安装 pip install nuitka pip install ordered-set # 加速编译 pip install zstandard # onef…

Javaweb中Vue指令的详细解析与应用

在现代Web开发中,Vue.js已经成为了一个非常流行且强大的前端框架,尤其是在JavaWeb项目中,它通过简化DOM操作,提高响应式交互的能力,大大加快了开发速度和提高了用户体验。Vue的核心之一是其指令系统,通过一系列预定义或自定义的指令,开发者可以更加方便地控制页面渲染和…

Svelte 最新中文文档教程(21)—— 自定义元素

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

AXI总线学习

AXI 总线概述 AXI协议是一种高性能、高带宽、低延迟的片内总线,具有如下特点: 1、总线的地址/控制和数据通道是分离的; 2、支持不对齐的数据传输; 3、支持突发传输,突发传输过程中只需要首地址; 4、具有分离的读/写数据通道; 5、支持显著传输访问和乱序访问; 6、更加容…

windows用任务计划定时执行powershell脚本

环境介绍】 操作系统:Windows Server 2019 Standard,64位操作系统 PowerShell版本:PowerShell 1.0 脚本位置:"F:\Scripts\BackupScript.ps1" 启动目录:"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe" 【步骤图】1.打开Windows任务计划…

城通网盘就是骗子,根本无法提现,大家不要再被坑了!

​今天很气愤,必须给大家曝光下被城通网盘坑的经历,大家以后都卸载这个垃圾网盘吧,根本无法提现,就是骗你免费给他打工,妥妥的无良企业! 我个人博客站(潘子夜个人博客)会分享一些免费的资源,一般都会上传到百度网盘、城通网盘和夸克网盘,毕竟城通网盘每天看上去还是有…

window的apt-get : Chocolatey工具的命令choco

Chocolatey是一款专为Windows系统开发的、基于NuGet的包管理器工具,类似于Node.js的npm,MacOS的brew,Ubuntu的apt-get,它简称为choco。Chocolatey的设计目标是成为一个去中心化的框架,便于开发者按需快速安装应用程序和工具。 Chocolatey用于完成Windows中软件的搜索、…

揭秘!软件测试开发质量衡量标准全攻略!

在软件开发过程中,软件质量是衡量产品成功与否的重要标准,直接关系到企业的生存和发展。而如何衡量软件质量一直是业界关注的焦点,一直是困扰开发测试团队的问题。随着技术的发展和项目管理方法的演进,质量衡量标准也从最初的简单BUG统计,发展到了更为复杂和全面的服务级别…

低代码开发样式管理全攻略:解锁高效美观界面打造密码

在低代码开发的广阔天地里,样式管理是塑造卓越用户界面的关键所在,它决定着项目的视觉质感与用户交互体验。接下来,让我们全方位剖析项目样式管理的核心要点,深入了解组件内部私有样式、项目全局样式,以及快捷样式和样式变量的运用技巧,助力你打造出既美观又实用的应用程…

雷电模拟器修改hosts

由于后端域名对应的IP地址变更,需要测试移动端是否会受到影响。可以通过修改模拟器的hosts文件实现该测试。先安装adb环境,并配置好环境变量;雷电模拟器打开可写入,默认是只读。(设置-磁盘-系统盘设置)。雷电模拟器开启ROOT权限。(设置-其他-打开 ROOT 权限)。找到雷电…