Bootstrap

Go-每日面试题目~(四)

原文地址:Go-每日面试题目~(四)

1、说说以下代码会输出什么内容?

 func main() {
     defer_call()
 }

func defer_call() {
    defer func() { fmt.Println("打印前") }()
    defer func() { fmt.Println("打印中") }()
    defer func() { fmt.Println("打印后") }()
    panic("触发异常")
}

上述代码会先输出【打印前】,之后是【打印中】,再然后是【打印后】,最后则是panic内容【panic:触发异常】,原因也不复杂就是defer的执行顺序是后进先出,当出现panic语句时,会先按照defer的后进先出的顺序执行,最后才会执行panic。

2、以下代码将会输出什么?请简要说明原因。

func main() {
     slice := []int{0,1,2,3}
     m := make(map[int]*int)
     for key,val := range slice {
         m[key] = &val
     }

    for k,v := range m {
        fmt.Println(k,"->",*v)
    }
}

上述代码出现问题的原因是for range循环的时候会创建每个元素的副本,而不是元素的引用,所以m[key] = &val取的都是变量val的地址,所以最后map中的所有元素的值都是变量val的地址,因为最后val被赋值为3,所有输出都是3。

至此,本次分享就结束了,后期会慢慢补充。

以上仅为个人观点,不一定准确,能帮到各位那是最好的。

好啦,到这里本文就结束了,喜欢的话就来个三连击吧。

扫码关注公众号,获取更多优质内容。

;