400-700-1307

【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號

                    内蒙古十一选五预测号