当前位置: 首页 > article >正文

【Go - 小心! Go中slice的传递陷阱 】

📢注意:slice 是引用传递 ,传递过去的参数,内存没有重新分配。

示例

package main

import "fmt"

// 引用传递 ,传递过去的地址,内存没有重新分配
func test(abc []int) {
    abc[0] = -1
}

func main() {
	s := make([]int, 0, 2)
	s = append(s, 1) // [1]
	test(s)
	fmt.Println(s)
}

输出: [-1]

问题
一道经典题目,下面会输出什么呢。

package main
import "fmt"
func change(abc []int) {
    abc = append(abc, 4)
    for i := range abc {
        abc[i] = 4
    }
    fmt.Println(abc)
}
func main() {
    abc := []int{1, 2, 3}
    abc = append(abc, 4)
    change(abc)
    fmt.Println(abc)
}

输出结果

[4 4 4 4 4]
[4 4 4 4]

没有答对的小伙伴,可以同时参考这篇 【Go - MD太可怕了,小心! Go中Slice的append陷阱】

关键点

  • append 空间不足时,会重新分配空间;空间充足时,则不会重新分配
  • 切片类型的值传递
  • 切片的数据结构

http://www.kler.cn/a/529476.html

相关文章:

  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_strerror_init()函数
  • 使用MATLAB进行雷达数据采集可视化
  • mysql大表的解决方案,及Hive分页查询
  • 几种K8s运维管理平台对比说明
  • 【oracle】分组求最新日期的数据
  • MySQL 索引
  • 第七篇:数据库备份与恢复
  • UE5 蓝图学习计划 - Day 10:UI 系统(HUD 与 Widget)
  • Web - CSS3基础语法与盒模型
  • python爬虫从0到1 - Scrapy框架的实战应用
  • 蓝桥杯备考:模拟算法之字符串展开
  • ubuntu22.04防火墙策略
  • VSCode设置颜色主题
  • 实体类实现Serializable接口
  • PyCharm中使用Ollama安装和应用Deepseek R1模型:完整指南
  • Vue.js组件开发-实现全屏图片文字缩放切换特效
  • SuccessFactors OData OAuth with SAP IAS-generated SAML assertion
  • gesp(C++六级)(10)洛谷:P10722:[GESP202406 六级] 二叉树
  • 深入解析Python机器学习库Scikit-Learn的应用实例
  • pandas(三)Series使用
  • SpringBoot 整合 Mybatis:提升你的Java项目开发效率
  • 游戏引擎 Unity - Unity 设置为简体中文、Unity 创建项目
  • 数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)
  • 洛谷P1403 [AHOI2005] 约数研究
  • 构建医疗AI编程可控价值观罗盘:多维度融合导向
  • FIR滤波器:窗函数法