<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## 三、Map ### (1) Map的Value賦值 > 下面代碼編譯會出現什么結果? > test7.go ```go package main import "fmt" type Student struct { Name string } var list map[string]Student func main() { list = make(map[string]Student) student := Student{"Aceld"} list["student"] = student list["student"].Name = "LDB" fmt.Println(list["student"]) } ``` **結果** 編譯失敗,`./test7.go:18:23: cannot assign to struct field list["student"].Name in map` **分析** `map[string]Student` 的value是一個Student結構值,所以當`list["student"] = student`,是一個值拷貝過程。而`list["student"]`則是一個值引用。那么值引用的特點是`只讀`。所以對`list["student"].Name = "LDB"`的修改是不允許的。 **方法一:** ```go package main import "fmt" type Student struct { Name string } var list map[string]Student func main() { list = make(map[string]Student) student := Student{"Aceld"} list["student"] = student //list["student"].Name = "LDB" /* 方法1: */ tmpStudent := list["student"] tmpStudent.Name = "LDB" list["student"] = tmpStudent fmt.Println(list["student"]) } ``` 其中 ```go /* 方法1: */ tmpStudent := list["student"] tmpStudent.Name = "LDB" list["student"] = tmpStudent ``` 是先做一次值拷貝,做出一個`tmpStudent副本`,然后修改該副本,然后再次發生一次值拷貝復制回去,`list["student"] = tmpStudent`,但是這種會在整體過程中發生2次結構體值拷貝,性能很差。 **方法二**: ```go package main import "fmt" type Student struct { Name string } var list map[string]*Student func main() { list = make(map[string]*Student) student := Student{"Aceld"} list["student"] = &student list["student"].Name = "LDB" fmt.Println(list["student"]) } ``` 我們將map的類型的value由Student值,改成Student指針。 ```go var list map[string]*Student ``` 這樣,我們實際上每次修改的都是指針所指向的Student空間,指針本身是常指針,不能修改,`只讀`屬性,但是指向的Student是可以隨便修改的,而且這里并不需要值拷貝。只是一個指針的賦值。 ### (2) map的遍歷賦值 --- > 以下代碼有什么問題,說明原因 > test8.go ```go package main import ( "fmt" ) type student struct { Name string Age int } func main() { //定義map m := make(map[string]*student) //定義student數組 stus := []student{ {Name: "zhou", Age: 24}, {Name: "li", Age: 23}, {Name: "wang", Age: 22}, } //將數組依次添加到map中 for _, stu := range stus { m[stu.Name] = &stu } //打印map for k,v := range m { fmt.Println(k ,"=>", v.Name) } } ``` **結果** 遍歷結果出現錯誤,輸出結果為 ```bash zhou => wang li => wang wang => wang ``` map中的3個key均指向數組中最后一個結構體。 **分析** foreach中,stu是結構體的一個拷貝副本,所以`m[stu.Name]=&stu`實際上一致指向同一個指針, 最終該指針的值為遍歷的最后一個`struct的值拷貝`。 ![](https://img.kancloud.cn/44/02/440218d6f132a32686ccd4a7d84b3f9b_1920x1080.jpeg) **正確寫法** ```go package main import ( "fmt" ) type student struct { Name string Age int } func main() { //定義map m := make(map[string]*student) //定義student數組 stus := []student{ {Name: "zhou", Age: 24}, {Name: "li", Age: 23}, {Name: "wang", Age: 22}, } // 遍歷結構體數組,依次賦值給map for i := 0; i < len(stus); i++ { m[stus[i].Name] = &stus[i] } //打印map for k,v := range m { fmt.Println(k ,"=>", v.Name) } } ``` ![](https://img.kancloud.cn/55/82/55827855b68b88a35ae41179b29f55fa_1920x1080.jpeg) **運行結果** ```bash zhou => zhou li => li wang => wang ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看