Go 切片 引用类型说明

本文通过实验展示了切片为引用类型的概念,探讨了如何使用切片进行数据操作及引用共享特性。通过实例演示了切片引用下数据修改的影响,并介绍了如何利用切片进行数据填充的操作。

今天看了无闻的GO 变成基础,看到了切片为引用类型的说明, 写代码实验了一下

    
    var slice1 []int = make([]int, 4, 6)
    var slice2 []int = slice1
    fmt.Println(slice1, slice2) // 输出内容  [0 0 0] [0 0 0]
    ////操作slice1 & slice2 看看是否会互相 影响
    slice1[1] = 11
    slice2[2] = 22
    slice1 = append(slice1, 33)
    fmt.Println(slice1, slice2) // 输出结果 [0 11 22 0 33] [0 11 22 0]
    slice2 = append(slice2, 44) //
    fmt.Println(slice1, slice2) // 输出结果  [0 11 22 0 44] [0 11 22 0 44]
 

查看输出结果: 发现 切片的引用类型说的是 赋值, 传入参数, 只会共享 底层的数组, 并不会共用两个切片的 quantity变量

var slice []int = make([]int, 6, 10)

    fmt.Println(slice) // [0 0 0 0 0 0]
    fillSlice(slice)
    fmt.Println(slice)// [0 1 2 3 0 0]
/*
    填充切片的内容
*/
func fillSlice(slice []int) {
    slice[0] = 0
    slice[1] = 1
    slice[2] = 2
    slice[3] = 3
    slice = append(slice, 4)
    slice = append(slice, 5)
    slice = append(slice, 6)
}

<think>好的,我现在需要回答用户关于Go语言切片用法的问题。首先,我要确保自己正确理解切片的概念,以及它在Go中的常见操作。让我先回忆一下相关知识。 切片(Slice)在Go中是动态数组,提供更灵活的数据处理方式。与数组不同,切片的长度不固定,可以动态增加或减少。这一点我记得对吗?对的,数组有固定长度,而切片是对数组的抽象,所以更灵活。 接下来,用户可能需要知道切片的基本声明和初始化方法。比如,使用make函数创建切片,或者通过数组来生成切片。例如: var s []int s := make([]int, 5) 或者从数组: arr := [3]int{1,2,3} s := arr[:] 这些例子是否正确?是的,用户可能需要这些基本操作。 然后,切片的常用操作,比如添加元素、截取部分、复制等。append函数是关键,用于动态添加元素。需要注意append可能引发底层数组的重新分配,这点需要提到吗?用户可能需要了解切片的自动扩容机制。 比如: s := []int{1,2,3} s = append(s, 4) 这样s的长度变为4。正确。另外,截取切片的部分可以用s[start:end],例如s[1:3],但需要注意左闭右开区间。这点容易出错,应该强调。 还有,切片的长度和容量,len()和cap()函数的区别。长度是当前元素数量,容量是底层数组的最大长度。这需要解释清楚,避免混淆。 另外,切片的复制,使用copy函数,可以避免共享底层数组的问题。比如: s1 := []int{1,2,3} s2 := make([]int, len(s1)) copy(s2, s1) 这样修改s2不会影响s1。这点对用户来说可能重要,特别是处理数据时需要注意引用问题。 还有,切片的遍历,使用for循环配合range关键字,例如: for index, value := range s { // 处理 } 这些是不是常见的用法?是的,应该包含。 还需要注意切片的零值是nil,判断切片是否为空应该用len(s) == 0,而不是s == nil,因为可能存在非nil但长度为0的情况。这点可能容易被忽视,需要提醒用户。 有没有其他需要注意的地方?比如切片作为函数参数传递时是引用类型,修改会影响原数据。用户可能需要注意这一点,以免意外修改。 总结一下,我需要组织这些点,分步骤介绍,结构清晰,简短但涵盖主要用法。可能需要分点说明:声明初始化、基本操作(增删改查)、长度容量、注意事项等。同时确保使用中文,避免术语错误,并保持例子简洁,符合用户要求的简短说明。</think>Go语言切片(Slice)是动态数组的实现,核心用法如下: --- ### 一、声明与初始化 ```go // 1. 直接声明 var s1 []int // 初始为nil s2 := []int{1, 2, 3} // 初始化值 // 2. 通过make创建 s3 := make([]int, 3) // 长度3,容量3 s4 := make([]int, 2, 5) // 长度2,容量5 // 3. 从数组/切片截取 arr := [5]int{0,1,2,3,4} s5 := arr[1:4] // [1,2,3] (含起始索引,不含结束索引) ``` --- ### 二、核心操作 1. **添加元素** ```go s := []int{1,2} s = append(s, 3) // [1,2,3] s = append(s, 4,5) // [1,2,3,4,5] ``` 2. **截取子切片** ```go s := []int{0,1,2,3,4} sub := s[1:3] // [1,2] (索引1到2) ``` 3. **复制切片** ```go src := []int{1,2,3} dst := make([]int, len(src)) copy(dst, src) // 深拷贝,修改dst不影响src ``` 4. **遍历** ```go for i, v := range s { fmt.Println(i, v) // 索引+值 } ``` --- ### 三、长度与容量 - **长度**:当前元素数量(`len(s)`) - **容量**:底层数组的最大元素数(`cap(s)`) - **扩容**:当`append`超过容量时,自动分配新数组(通常容量翻倍) --- ### 四、注意事项 1. 切片是**引用类型**,多个切片可能共享底层数组 2. 判断空切片使用 `len(s) == 0`,而非 `s == nil` 3. 可通过 `s[:0]` 清空元素(保留底层数组) --- 掌握这些操作即可应对90%的切片使用场景!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值