• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

原文: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人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go 验证是否字符串包含中文发布时间:2022-07-10
下一篇:
Go-sword(利刃)是一款基于Go语言的可视化web管理后台生成工具发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap