append用完后就直接删除mysql元素了吗?

append用完后就直接删除mysql元素了吗?

myslice := append(courseSlice[:2], courseSlice[3:]...)这句执行后,courseSlice的值也发生变化,courseSlice的值变成["go", "grpc", "es", "gin"]吗?


https://img1.sycdn.imooc.com/climg/660c0c7f09cd350025321370.jpg


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
bobby 2025-02-17 21:21:49

为什么 courseSlice 可能会被修改?

append(courseSlice[:2], courseSlice[3:]...) 的执行步骤如下:

  1. courseSlice[:2]["go", "grpc"]

  2. courseSlice[3:]["es", "gin"]

  3. append(courseSlice[:2], courseSlice[3:]...)["go", "grpc"] + ["es", "gin"] = ["go", "grpc", "es", "gin"]

  4. myslice 指向 courseSlice底层数组(可能和 courseSlice 共享底层数组)。

  5. 如果 append 发生在 courseSlice 的原始容量范围内,则 courseSlice 的底层数组也会被修改

因此,如果 courseSlice 的底层数组没有被 append 重新分配(容量足够),那么 myslicecourseSlice 仍然共享相同的底层数组,此时 courseSlice 也会变成 ["go", "grpc", "es", "gin"],因为 append 直接修改了原数组的内容。


bobby 2024-04-06 10:03:18

你上面的append地方修改了c的值  下面是append的源码 你可以看一下 

func append(s []T, vs ...T) []T {
	// 获取切片的长度和容量
	n := len(s)
	m := n + len(vs)
	// 如果容量不够,就扩容
	if m > cap(s) {
		newcap := m
		if newcap < 2*cap(s) {
			newcap = 2 * cap(s)
		}
		newslice := make([]T, m, newcap)
		copy(newslice, s)
		s = newslice
	}
	return s[:m]
}


  • 没看懂老师的这个回复, 为什么myslice := append(courseSlice[:2], courseSlice[3:]...)这句能导致courseSlice也改变了?

    2025-02-15 12:31:28
  • 懂了

    2025-02-23 03:40:39
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Go开发工程师全新版
  • 参与学习       526    人
  • 解答问题       606    个

风口上的技术,薪资水平遥遥领先,现在学习正值红利期! 未来3-5年,Go语言势必成为企业高性能项目中不可替代的语言 从基础到项目实战再到重构,对转行人员友好,真正从入门到精通!

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师