原文地址: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。
至此,本次分享就结束了,后期会慢慢补充。
以上仅为个人观点,不一定准确,能帮到各位那是最好的。
好啦,到这里本文就结束了,喜欢的话就来个三连击吧。
扫码关注公众号,获取更多优质内容。