首页 > 试题广场 >

以下代码的输出结果是什么? package main imp

[单选题]
以下代码的输出结果是什么?
package main
import "fmt"
func main() {
    s := make([]int, 0, 3)
    s = append(s, 1)
    f(s)
    fmt.Println(s)
}
func f(s []int) {
    s = append(s, 2)
    s[0] = 5
}
  • [5]
  • [1]
  • [5 2]
  • [1 2]
这题虽然简单,但还是有很多坑的。
1、切片的底层结构包括“指向底层数组的指针、切片的长度、底层数组的容量”;
2、Go中所有参数的传递都是值传递,没有什么“引用传递”的说法。只是对于引用类型,复制的是地址或指针。
3、切片的长度决定可见范围,是切片的一部分而不是底层数组的组成,所有切片的长度修改不共享;

串起来就可以知道,函数通过值传递得到了切片的副本,切片副本和原切片共享底层数组,但不共享长度。

其他:切片的容量在参数传递后也是独立的副本了,在没有发生扩容时和原切片容量一致(看起来共享),但在函数中发生扩容后,函数中的切片会指向新的底层数组,容量必然发生改变。所有容量的操作也是不共享的。
发表于 今天 09:54:28 回复(0)