1. 写出下面代码输出内容
package main
import "fmt"
func main() {
defer_call()
}
func defer_call() {
defer func() {
fmt.Println("打印前")
}()
defer func() {
fmt.Println("打印中")
}()
defer func() {
fmt.Println("打印后")
}()
panic("触发异常")
}
//以上代码执行顺序是不一定的,
//defer函数属于延迟执行,就是执行到return之前执行,然后再return
//一般defer,panic,recover()配合使用来捕获异常。
//recover放在哪个函数中,panic就会在哪个函数中执行
//必须先声明defer,否则recover()不能捕获到异常
//如果多个defer都使用recover(),那个panic就是使用离它最近的recover()捕获并正常处理
代码修改后
第一种情况:
package main
import "fmt"
func main() {
defer_call()
}
func defer_call() {
defer func() {
if err:=recover();err!=nil{ fmt.Println(err) //err就是panic } fmt.Println("打印前") }() defer func() { fmt.Println("打印中") }() defer func() { fmt.Println("打印后") }() panic("触发异常") }
执行结果:
package main
import "fmt"
func main() {
defer_call()
}
func defer_call() {
defer func() {
if err:=recover();err!=nil{
fmt.Println(err) //err就是panic
}
fmt.Println("打印前")
}()
defer func() {
if err:=recover();err!=nil{
fmt.Println(err) //err就是panic
}
fmt.Println("打印中")
}()
defer func() {
if err:=recover();err!=nil{
fmt.Println(err) //err就是panic
} fmt.Println("打印后")
}()
panic("触发异常")
}
2. 以下代码有什么问题,说明原因
package main
import "fmt"
type student struct {
Name string
Age int
}
func pase_student() map[string]*student {
m := make(map[string]*student)
stus := []student{
{"zhou", 24},
{"li", 23},
{"wang", 22},
}
for i, _ := range stus {
m[stu.Name] = &stu
}
return m
}
func main() {
students := pase_student()
for k, v := range students {
fmt.Printf("key=%s,value=%v\n", k, v)
}
}
/*
执行结果:
key=zhou,value=&{wang 22}
key=li,value=&{wang 22}
key=wang,value=&{wang 22}
发现value都是一样的,这是因为19行的&stu是指针,地址都保持不变,所以每个遍历都是值拷贝,所以实际上
m[stu_Name]=%stu都是指向的是同一个地址,最终遍历后的值都是最后一个map的值,wang,22
应该改成
for i, _ := range stus {
stu=stus[i]
m[stu.Name] = &stu
}
以上代码是将stus遍历的每个值进行拷贝,拷贝完后每个地址的值都不一样。
*/
以下是修改后的代码
package main
import "fmt"
type student struct { Name string Age int } func pase_student() map[string]*student { m := make(map[string]*student) stus := []student{ {"zhou", 24}, {"li", 23}, {"wang", 22}, } for i, _ := range stus { fmt.Println("111",stus) stu:=stus[i]//这里直接用key来取value赋值到stu变量中,这样stu的地址都是新的。 m[stu.Name] = &stu } return m } func main() { students := pase_student() fmt.Println(students) for k, v := range students { fmt.Printf("key=%s,value=%v\n", k, v) } }