go语言切片作为函数参数传递用append添加元素

原文:https://blog.csdn.net/weixin_42117918/article/details/81835942

切片作为函数,通过append添加元素,有可能会更改地址:
1)添加的数据元素长度超过切片参数的容量,则会另开辟空间,重新分配底层数组,并复制数据。函数中的此切片与原切片地址不同; 此切片指向新开辟的内存。函数运行结束,内存释放,不会影响元切片的内容。
2)否则原切片与函数中的切片指向同一地址。会影响切片的内容。

3)切片名本身就是一个指针(内容保存指向切片的首地址)

 

代码测试:

package main
import "fmt"
func main01() {
    s := make([]int, 3, 5)
    s[2] = 8888
    fmt.Printf("原地址:%p", s)
    s = append(s, 12)
    fmt.Printf("\n添加数据之后的地址:%p", s)
    /*
    append添加元素,容量足够,则在原基础之上添加数据,地址不会发生改变
    输出:
    原地址:0xc04207e030
    添加数据之后的地址:0xc04207e030
    */
}
func main02() {
    s := make([]int, 3)
    s[2] = 666
    fmt.Printf("append添加数据之前的地址:%p", s)
    s = append(s, 888)
    fmt.Printf("\nappend添加数据之后的地址:%p", s)
 
    /*
    append添加数据,容量不够,则另行开辟空间,切片地址发生变化
    输出:
    append添加数据之前的地址:0xc04200e2c0
    append添加数据之后的地址:0xc04200a2d0
    */
}
func main() {
    /*
    copy(目的切片,原切片):切片拷贝
    注意事项:目的切片要有足够的空间,如果没有空间(切片为空或者指向0x0),不能进行拷贝
              若目的切片容量不足,只拷贝部分(目的切片长度的部分)
    返回值为拷贝成功的切片数量
    */
    s := make([]int, 3)
    s[0] = 0
    s[1] = 111
    s[2] = 666
    //var s1 []int = []int{5: 333}
    //n:=copy(s,s1)
    s1 := make([]int, 1, 2)
    n := copy(s1, s)
 
    fmt.Printf("原切片s的地址是:%p", s)
    fmt.Printf("\n拷贝之后的切片s1的地址是:%p,数量:%d", s1, n)
    fmt.Println(s1)
}


补充说明:
数组和slice之间有着紧密的联系。一个slice是一个轻量级的数据结构,提供了访问数组子序列(或者全部)元素的功能,而且slice的底层确实引用一个数组对象。一个slice由三个部分构成:指针、长度和容量。指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素并不一定就是数组的第一个元素。

切片并不是数组或数组指针,它通过内部指针和相关属性引⽤数组⽚段,以实现变⻓⽅案。

slice并不是真正意义上的动态数组,而是一个引用类型。slice总是指向一个底层array,slice的声明也可以像array一样,只是不需要长度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值