Go每日一题(102) 的题目如下

4372 次点击 · 5 赞 ·大约8小时之前 开始浏览   · 来源「Golang来啦」

下面这段代码输出什么?

func change(s ...int) {
	s = append(s,3)
}

func main() {
	slice := make([]int,5,5)
	slice[0] = 1
	slice[1] = 2
	change(slice...)
	fmt.Println(slice)
	change(slice[0:2]...)
	fmt.Println(slice)
}
4372 阅读
58 回复
528548004
528548004 · #51 · 大约1年之前

mark

amocea
amocea · #52 · 大约1年之前

第一次的 change() 里面传入的是 slice=[1,2,0,0,0],len = 5,cap = 5,尽管 append() 修改了底层数组,但是 len,cap 不变,所以 slice 仍然为 [1,2,0,00]; 第二次的 change() 里面传入的是 slice=[1,2,0,0,0],len = (2-0) = 2,cap = 5,所以 append() 的时候,尽管 len,cap 不变,但是 append() 修改的时 idx=2 时的元素,打印的是 slice,len = 5,所以最终输出的就是 [1,2,3,0,0] 注意:语法糖仍然是将数组传递进去,但是函数内部仍然会拷贝切片副本

brothersam
brothersam · #53 · 大约1年之前

[1 2 0 0 0 ] [1 2 3 0 0] 第一个,更换了底层数组,第二个没有更换底层数组

YuPeng
YuPeng · #54 · 大约1年之前

mark

jeliflam
jeliflam · #55 · 大约1年之前

第一次调用 change() 时,append() 操作使切片底层数组发生了扩容,这里为什么会发生扩容?

johnny_wu
johnny_wu · #56 · 大约1年之前

mark

YuPeng
YuPeng · #57 · 9月之前

mark

zhang-jianqiang
zhang-jianqiang · #58 · 9月之前
jeliflamjeliflam #55 回复

第一次调用 change() 时,append() 操作使切片底层数组发生了扩容,这里为什么会发生扩容?

因为切片初初始化时指定了长度,那么切片就会初化成指定长度的零值,也是就初化化后切片是这样的:[0,0,0,0,0]

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传