Go面试题28

Posted by     "" on Friday, December 27, 2019

Go面试题28

1: 下面的代码有什么问题?

func main() {
    fmt.Println([...]int{1} == [2]int{1})
    fmt.Println([]int{1} == []int{1})
}

2: 一道很有代表的题目, 很多老司机都因此翻车!
下面这段代码输出什么? 如果编译错误的话, 为什么?

var p *int

func foo() (*int, error) {
    var i int = 5
    return &i, nil
}

func bar() {
    // use p
    fmt.Println(*p)
}

func main() {
    p, err := foo()
    if err != nil {
        fmt.Println(err)
        return
    }
    bar()
    fmt.Println(*p)
}
  • A. 5 5
  • B. runtime error

参考答案及解析

1: 答案及解析: 有两处错误.

go 中不同类型不能比较的, 而数组长度是数组类型的一部分,所以[...]int{1}[2]int{1} 是两种不同的类型,不能比较.
切片是不能比较;

2: 答案及解析: B. 知识点: 变量作用域. 问题出现在操作符:=,对于使用:=定义的变量,如果新变量与同名已定义的变量不在同一作用域中,那么Go 会新定义这个变量. 对于本例来说,main()函数里的p 是新新定义的变量,会遮住全局变量p, 导致执行到bar()时程序, 全局变量p依然是nil, 程序随机Crash.

正确的做法是将main()函数修改为:

func main() {
    var err error
    p, err = foo()
    if err != nil {
        fmt.Println(err)
        return
    }
    bar()
    fmt.Println(*p)
}

「真诚赞赏,手留余香」

Richie Time

真诚赞赏,手留余香

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