切片相关面试题 #
以下代码输出多少,为什么? #
package main
func main() {
x := []int{100, 200, 300, 400, 500, 600, 700}
abc := &x[1] //引用传递
x = append(x, 800)
for i := range x {
x[i]++
}
println(*abc)
}
以上代码打印 200
因为原切片x的容量已经满了,长度7,
执行 append 操作之后会创建一个新的底层数组,并将原切片底层数组的值拷贝到新的数组,原数组保持不变
以下代码输出什么,为什么? #
package main
func main() {
x := make([]int, 0, 7) //长度7
x = append(x, 100, 200, 300, 400, 500, 600, 700) //正好容器满
abc := &x[1]
x = append(x, 800) //追加一个单元值,容量满了,底层重新复制一个底层数据
for i := range x {
x[i]++ //修改新底层数组值
}
println(*abc) // 输出 200
x = make([]int, 0, 8) // 指向另一个切片,长度为8
x = append(x, 100, 200, 300, 400, 500, 600, 700) //
abc = &x[1]
x = append(x, 800) // 执行 append 操作,容量足够,不会重新申请内存
for i := range x {
x[i]++
}
println(*abc) // 输出 201
}
以下输出什么 #
package main
import "fmt"
func main() {
a := []int{0, 1}
fmt.Println(len(a)) //2
fmt.Printf("%v \n", a[len(a):]) //[]
fmt.Printf("%v \n", a[len(a)-1:]) //[1]
fmt.Printf("%v \n", a[:len(a)]) //[0 1]
}
因为 a[i:j] 取下标值范围为 i<= 下标 < j
下标从0开始计算