面试题库

【GO+区块链面试题】考点foreach

2019-01-26 17:05
以下代码有什么问题,说明原因。
 
1.type student struct {
2.Name string
3.Age  int
4.}
5.func pase_student() {
6.m := make(map[string]*student)
7.stus := []student{
8.{Name: "zhou", Age: 24},
9.{Name: "li", Age: 23},
10.{Name: "wang", Age: 22},
11.}
12.for _, stu := range stus {
13.m[stu.Name] = &stu
14.}
15.}
考点:foreach
解答:
这样的写法初学者经常会遇到的,很危险! 与Java的foreach一样,都是使用副本的方式。所以m[stu.Name]=&stu实际上一致指向同一个指针, 最终该指针的值为遍历的最后一个struct的值拷贝。 就像想修改切片元素的属性:
 
1.for _, stu := range stus {
2.stu.Age = stu.Age+10
3.}
也是不可行的。 大家可以试试打印出来:

 
1.func pase_student() {
2.m := make(map[string]*student)
3.stus := []student{
4.{Name: "zhou", Age: 24},
5.{Name: "li", Age: 23},
6.{Name: "wang", Age: 22},
7.}
8.// 错误写法
9.for _, stu := range stus {
10.m[stu.Name] = &stu
11.}
12.for k,v:=range m{
13.println(k,"=>",v.Name)
14.}
15.// 正确
16.for i:=0;i<len(stus);i++  {
17.m[stus[i].Name] = &stus[i]
18.}
19.for k,v:=range m{
20.println(k,"=>",v.Name)
21.}
22.}
关注兄弟连更多精彩内容等着你

开班信息

当前校区

北京校区
  • 北京校区
  • 上海校区
  • 广州校区
  • 沈阳校区
  • 杭州校区
  • 南京校区
  • 郑州校区
  • 成都校区
  • 深圳校区
  • 西安校区
  • 苏州校区

Copyright © 2007-2019 IT兄弟连教育 版权所有 京ICP备11018177号  京公网安备 11010802026987号