2022-07-16:以下go语言代码输出什么?A:[];B:[5];C:[5 0 0 0 0];D:[0 0 0
2022-07-16:以下go语言代码输出什么?A:[];B:[5];C:[5 0 0 0 0];D:[0 0 0 0 0]。
package main
import (
"fmt"
)
func main() {
a := make([]int, 0, 5)
addElem(a, 5)
fmt.Println(a)
}
func addElem(a []int, i int) {
a = append(a, 5)
}
答案选A。可以简单的理解切片本身是结构体,参数传递只是结构体复制传递。切片在大多数情况下,只能修改元素,不能删除或者新增元素。
本作品采用《CC 协议》,转载必须注明作者和本文链接
对slice的修改只会改底层的数据,不会修改长度和容量,append后a底层的数据已经添加了5这个元素,只是因为a的长度是0没有显示出来,所以输出[]。
Go的slice底层其实是结构体:
该
addElem()
中将 slice 作为参数传递时依然是值传递,因此传入的是该 slice 的拷贝,故addElem中是一个新的slice
;所以原来的
a
实际是没执行任何操作,因此打印a
的结果为[]
,而addElem()
中 因为是值拷贝,所以在append()
后打印结果为[5]