Go面试题32

Posted by     "" on Thursday, January 2, 2020

Go面试题32

1: 下面这段代码输出结果正确吗?

type Foo struct {
    bar string
}

func main() {
    s1 := []Foo{
        {"A"},
        {"B"},
        {"C"},
    }
    s2 := make([]*Foo, len(s1))
    for i, value := range s1 {
        s2[i] = &value
    }
    fmt.Println(s1[0], s1[1], s1[2])
    fmt.Println(s2[0], s2[1], s2[2])
}

// 输出
{A} {B} {C}
&{A} &{B} &{C}

2: 下面代码里的counter的输出值?

func main() {
    var m = map[string]int{
        "A": 21,
        "B": 22,
        "C": 23,
    }
    counter := 0
    for k, v := range m {
        if counter == 0 {
            delete(m, "A")
        }
        counter++
        fmt.Println(k, v)
    }
    fmt.Println("counter is ", counter)
}
  • A: 2
  • B: 3
  • C: 23

参考答案及解析

1: 答案及解析: s2的输出结果错误. s2的输出是&{C} &{C} &{C}, 在第30的面试题答案及解析中,我们提到过for range使用端变量声明(:=)的形式迭代变量时,变量i, value在每次循环体重都会被重用,而不是重新声明.所以s2每次填充的临时变量value的地址, 而最后一次循环中, value被赋值为{c}.因此, s2输出的时候显示出了三个{c}.

可行的解决办法如下:

for i := range s1 {
    s2[i] = s1[i]
}

2: 答案及解析: C. for range map 是无需的, 如果第一次循环到A, 则输出3;否则输出2.

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

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