一、以下代码的输出内容为
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package main import ( "fmt" ) func main() { defer_call() } func defer_call() { defer func() { fmt.Println("打印前") }() defer func() { fmt.Println("打印中") }() defer func() { fmt.Println("打印后") }() panic("触发异常") } |
答案
1 2 3 4 |
打印后 打印中 打印前 panic: 触发异常 |
解析
考查defer和panic组合的情况,在有panic时,会先执行defer然后再把恐慌传递出去。
更多相关内容可查看defer常见的坑以及官方文档描述。
二、以下代码有什么问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package main import ( "fmt" ) type student struct { Name string Age int } func pase_student() map[string]*student { m := make(map[string]*student) stus := []student{ {Name: "zhou", Age: 24}, {Name: "li", Age: 23}, {Name: "wang", Age: 22}, } for _, stu := 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) } } |
答案
1 2 3 |
key=zhou,value=&{wang 22} key=li,value=&{wang 22} key=wang,value=&{wang 22} |
解析
for循环使用stu遍历时,stu只是一个临时变量,遍历过程中指针地址不变,所以后面的赋值都是指向了同一个内存区域,导致最后所有的信息都一致。
goc/c++python
修改方案
1 2 3 4 |
for i, _ := range stus { stu:=stus[i] m[stu.Name] = &stu } |
三、下面的代码会输出什么,并说明原因
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package main import ( "sync" "fmt" ) func main() { wg := sync.WaitGroup{} wg.Add(21) for i := 0; i < 10; i++ { go func() { fmt.Println("i: ", i) wg.Done() }() } for j := 0; j < 10; j++ { go func(x int) { fmt.Println("j: ", x) wg.Done() }(j) } wg.Wait() } |
答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
j: 9 i: 10 j: 0 j: 1 j: 2 j: 3 j: 4 j: 5 j: 6 i: 10 i: 10 i: 10 i: 10 i: 10 j: 8 i: 10 i: 10 i: 10 j: 7 i: 10 |
解析
go func(){}
四、下面代码会输出什么
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
type People struct{} func (p *People) ShowA() { fmt.Println("showA") p.ShowB() } func (p *People) ShowB() { fmt.Println("showB") } type Teacher struct { People } func (t *Teacher) ShowB() { fmt.Println("teacher showB") } func main() { t := Teacher{} t.ShowA() } |
答案
1 2 |
showA showB |
解析
go中没有继承,只有组合。Teacher中的People是一个匿名对象,通过它调用的函数都是自身的。