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:
2
或3
参考答案及解析
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
.
「真诚赞赏,手留余香」
真诚赞赏,手留余香
使用微信扫描二维码完成支付