Go面试题31

Posted by     "" on Monday, December 30, 2019

Go面试题31

1: 下面这段代码输出什么?

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.Printn(slice)
}

2: 下面这段代码输出什么?

func main() {
    var a = []int{1,2,3,4,5}
    var r [5]int

    for i, v := range a {
        if i == 0 {
            a[1] = 12
            a[2] = 13
        }
        r[i] = v
    }
    fmt.Println("r = ", r)
    fmt.Println("a = ", a)
}

参考答案及解析

1: 答案及解析

[1 2 0 0 0]
[1 2 3 0 0]

知识点: 可变函数,append()操作.
Go 提供的语法糖..., 可以将slice 传进可变函数, 不会创建新的切片. 第一次调用change()时, append()操作使切片底层组数发生了扩容,原slice的底层数组不会改变; 第二次调用change()函数时,使用了操作符[i,j]获得一个新的切片, 假定为slice1, 它的底层数组和原切片底层数组是重合的, 不过slice1的长度,和容量分别是2, 5,所以在change()函数中对slice1底层组数的修改会影响到原切片.
slice

2: 答案及解析

r =  [1 12 13 4 5]
a =  [1 12 13 4 5]

这里的a 是一个切片, 那切片是怎么实现的呢? 切片在go的内部结构有一个指向底层数组的指针, 当range 表达式发生复制时,副本的指针依旧指向原底层数组,所以对切片的修改都会反映到底层数组上, 所以通过v可以获的修改后的数组元素.

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

使用微信扫描二维码完成支付