面试题4

切片相关面试题 #

以下代码输出多少,为什么? #

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开始计算
Build by Loppo 0.6.15