GoLang基礎數據類型--->字典(map)詳解


                   GoLang基礎數據類型--->字典(map)詳解

                                            作者:尹正傑

版權聲明:原創作品,謝絕轉載!否則將追究法律責任。

 

   可能大家剛剛接觸Golang的小伙伴都會跟我一樣,這個map是干嘛的,是函數嗎?學過python的小伙伴可能會想到map這個函數。其實它就是Golang中的字典。下面跟我一起看看它的特性吧。map 也就是 Python 中字典的概念,它的格式為“map[keyType]valueType”。 map 的讀取和設置也類似 slice 一樣,通過 key 來操作,只是 slice 的index 只能是`int`類型,而 map 多了很多類型,可以是 int ,可以是 string及所有完全定義了 == 與 != 操作的類型。

 

一.map的賦值方式

1.先的聲明再初始化最后賦值

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "fmt"
12     "reflect"
13 )
14 
15 func main() {
16     var yinzhengjie map[string]string //先聲明一個字典(map)名字叫做yinzhengjie。其key所對應的數據類型是“string”[字符串],value所對應的數據類型也是“string”。
17     fmt.Printf("判斷yinzhengjie字典是否為空:【%v】\n",yinzhengjie == nil)  //聲明的字典,默認為空,需要用make進行初始化操作(map是引用類型,未初始化的是指向nil,初始化了以后應該就有自己的內存空間了,所以不是nil。)所以返回值為空。
18     fmt.Printf("第一次查看yinzhengjie字典的值:【%v】\n",yinzhengjie)
19     yinzhengjie = make(map[string]string) //再使用make函數進行初始化創建一個非nil的map,nil map不能賦值,如果直接賦值會報錯:“panic: assignment to entry in nil map”
20     fmt.Printf("再次判斷yinzhengjie字典是否為空:【%v】\n",yinzhengjie == nil) //你就把它理解為一個指針,沒初始化就是nil,make之后分配內存了,一旦分配了內存地址就不為空了
21     fmt.Printf("第二次查看yinzhengjie字典的值:【%v】\n",yinzhengjie)
22     yinzhengjie["name"] = "尹正傑"
23     fmt.Printf("yinzhengjie字典的類型為:【%v】\n",reflect.TypeOf(yinzhengjie))
24     fmt.Printf("第三次查看yinzhengjie字典的值:【%v】\n",yinzhengjie)
25 }
26 
27 
28 
29 #以上代碼執行結果如下:
30 判斷yinzhengjie字典是否為空:【true】
31 第一次查看yinzhengjie字典的值:【map[]】
32 再次判斷yinzhengjie字典是否為空:【false】
33 第二次查看yinzhengjie字典的值:【map[]】
34 yinzhengjie字典的類型為:【map[string]string】
35 第三次查看yinzhengjie字典的值:【map[name:尹正傑]】

 

2.直接make進行初始化之后再賦值

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[string]int) //表示創建一個key為string,value的值為int的數據類型。
14     yinzhengjie["yzj"] = 25
15     fmt.Println(yinzhengjie)
16 }
17 
18 
19 
20 #以上代碼執行結果如下:
21 map[yzj:25]

3.直接初始化賦值

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := map[string]int{
14         "尹正傑":18,
15         "餅干":20,
16     }
17     fmt.Println(yinzhengjie)
18 }
19 
20 
21 
22 #以上代碼執行結果如下:
23 map[尹正傑:18 餅干:20]

 

二.map的增刪改查

1.字典的賦值操作

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[int]string)
14     letter := []string{"a","b","c","d","e","f","g","h"}
15     for k,v := range letter{
16         yinzhengjie[k] = v
17     }
18     fmt.Println(yinzhengjie) //注意,字典是無序的喲!
19 }
20 
21 
22 
23 
24 #以上代碼執行結果如下:
25 map[7:h 0:a 1:b 2:c 3:d 4:e 5:f 6:g]

2.字典的刪除操作

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[int]string)
14     letter := []string{"a","b","c","d","e","f","g","h"}
15     for k,v := range letter{
16         //fmt.Println(k,v)
17         yinzhengjie[k] = v
18     }
19     fmt.Println(yinzhengjie) //注意,字典是無序的喲!
20 
21     for i:=0;i<4 ;i++  {
22         delete(yinzhengjie,i)  //刪除字典中key所對應的value.1
23     }
24     fmt.Println(yinzhengjie)
25 
26     for k := range yinzhengjie{
27         delete(yinzhengjie,k) //刪除整個字典的數據
28     }
29     fmt.Println(yinzhengjie)
30     fmt.Println(yinzhengjie==nil) //字典的“殼子”還在,空字典也是有地址的。所以返回值是false!
31 }
32 
33 
34 
35 #以上代碼執行結果如下:
36 刪除之前的樣子:【map[5:f 6:g 7:h 0:a 1:b 2:c 3:d 4:e]】
37 第一次刪除之后的樣子:【map[5:f 6:g 7:h 4:e]】
38 第二次刪除之后的樣子:【map[]】
39 字典被清空之后是否為空:【false】

 3.字典的修改操作

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[int]string)
14     letter := []string{"a","b","c","d","e","f","g","h"}
15     for k,v := range letter{
16         //fmt.Println(k,v)
17         yinzhengjie[k] = v
18     }
19     fmt.Printf("修改之前的樣子:【%v】\n",yinzhengjie)
20     yzj := yinzhengjie //map是一種引用類型,如果兩個map同時指向一個底層,那么一個改變,另一個也相應的改變。
21     yzj[0] = "尹正傑"  //修改字典下標所對應的值。
22     yzj[1] = "yinzhengjie"
23     fmt.Printf("修改之后的樣子:【%v】\n",yinzhengjie)//注意,字典是無序的喲!
24 }
25 
26 
27 
28 #以上代碼執行結果如下:
29 修改之前的樣子:【map[0:a 1:b 2:c 3:d 4:e 5:f 6:g 7:h]】
30 修改之后的樣子:【map[7:h 0:尹正傑 1:yinzhengjie 2:c 3:d 4:e 5:f 6:g]】

4.字典的查詢方式

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[int]string)
14     letter := []string{"a","b","c","d","e","f","g","h"}
15     for k,v := range letter{
16         yinzhengjie[k] = v
17     }
18     fmt.Println(yinzhengjie) //注意,字典是無序的喲!我下面之所以通過循環遍歷,是因為的確存在哪些key喲!
19 
20     for i,j := range yinzhengjie{  //遍歷key和value。
21         fmt.Println("key=",i,"value=",j)
22     }
23 
24     for i := range yinzhengjie{ //只遍歷key
25         fmt.Println(i)
26     }
27 }
28 
29 
30 
31 
32 #以上代碼執行結果如下:
33 map[3:d 4:e 5:f 6:g 7:h 0:a 1:b 2:c]
34 key= 6 value= g
35 key= 7 value= h
36 key= 0 value= a
37 key= 1 value= b
38 key= 2 value= c
39 key= 3 value= d
40 key= 4 value= e
41 key= 5 value= f
42 3
43 4
44 5
45 6
46 7
47 0
48 1
49 2

 5.原地修改字典的Value

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 type Student struct {
13     ID int
14     NAME string
15 }
16 
17 func main() {
18     dict := make(map[int]*Student)
19     dict[1] = &Student{
20         ID:100,
21         NAME:"yinzhengjie",
22     }
23 
24     dict[2] = &Student{
25         ID:200,
26         NAME:"尹正傑",
27     }
28 
29 
30     fmt.Println(dict[1])
31     s := dict[1]
32     s.ID = 100000  //原地修改字典的value.
33     fmt.Println(dict)
34     fmt.Println(dict[1])
35 }
36 
37 
38 
39 #以上代碼執行結果如下:
40 &{100 yinzhengjie}
41 map[1:0xc042044400 2:0xc042044420]
42 &{100000 yinzhengjie}

 

三.map的常用技巧

1.判斷map鍵值是否存在

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     yinzhengjie := make(map[int]string)
14     letter := []string{"a","b","c","d","e","f","g","h"}
15     for k,v := range letter{
16         yinzhengjie[k] = v
17     }
18     fmt.Printf("字典中的值為:【%v】\n",yinzhengjie) //注意,字典是無序的喲!
19     if v, ok := yinzhengjie[1]; ok {
20         fmt.Println("存在key=",v)
21     }else {
22         fmt.Println("沒有找到key=",v)
23     }
24 
25     v ,ok := yinzhengjie[1]
26     if ok {
27         fmt.Println("再一次確認,已經存在key=",v)
28     }else {
29         fmt.Println("再一次確認,沒有找到key=",v)
30     }
31 }
32 
33 
34 
35 
36 #以上代碼執行結果如下:
37 字典中的值為:【map[3:d 4:e 5:f 6:g 7:h 0:a 1:b 2:c]】
38 存在key= b
39 再一次確認,已經存在key= b

 

2.map的排序

  我們都知道字典的默認都是無需的,但是我們可以借用標准庫的包來進行基於字母或數字的順序來排序,從而達到我們想要的結果,我們就以2016全球計算機語言排行前十的案例來展示吧:

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "fmt"
12     "sort"
13 )
14 
15 func main() {
16     var ProgramingLanguage = map[string]int{
17         "Java":                    0,
18         "C":                         1,
19         "C++":                           2,
20         "Python":                   3,
21         "C#":                          4,
22         "PHP":                       5,
23         "JavaScript":             6,
24         "Visual Basic.NET":         7,
25         "Perl":                       8,
26         "Assembly language":       9,
27         "Ruby":                      10,
28     }
29     var SortString []string
30     for k := range ProgramingLanguage {
31         SortString = append(SortString, k)
32     }
33     sort.Strings(SortString)  //會根據字母的順序進行排序。
34     for _, k := range SortString {
35         fmt.Println("Key:", k, "Value:", ProgramingLanguage[k])
36     }
37 }
38 
39 
40 
41 #以上代碼執行結果如下:
42 Key: Assembly language Value: 9
43 Key: C Value: 1
44 Key: C# Value: 4
45 Key: C++ Value: 2
46 Key: Java Value: 0
47 Key: JavaScript Value: 6
48 Key: PHP Value: 5
49 Key: Perl Value: 8
50 Key: Python Value: 3
51 Key: Ruby Value: 10
52 Key: Visual Basic.NET Value: 7

3.map的嵌套

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 type EmployeeInformation map[string]int
13 
14 func main() {
15 
16     StaffQuarters := make(map[string]EmployeeInformation)
17     EmployeeNumber := make(EmployeeInformation)
18     EmployeeNumber["yinzhengjie"] = 23
19     EmployeeNumber["bingan"] = 24
20 
21     StaffQuarters["888"] = EmployeeNumber
22     StaffQuarters["999"] = EmployeeInformation{"fanbinxin": 25, "zhouzhiruo": 26,}
23     fmt.Println(StaffQuarters)
24 }
25 
26 
27 
28 #以上代碼執行結果如下:
29 map[888:map[bingan:24 yinzhengjie:23] 999:map[fanbinxin:25 zhouzhiruo:26]]

 

4.map的嵌套用法展示

 

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     Province:=make(map[string]map[string][]string) //定義省的字典
14     City:=make(map[string][]string)  //定義市區的字典
15     Scenery := make(map[string][]string)  //定義景區的字典
16     Scenery["西安"] = []string{    "秦始皇兵馬俑","大雁塔","大唐芙蓉園","華清池","黃巢堡國家森林公園","西安碑林博物館","驪山國家森林公園","西安城牆","秦始皇陵","翠華山",}
17     Scenery["安康"] = []string{"中壩大峽谷","香溪洞","安康雙龍生態旅游度假區","瀛湖生態旅游景區","簡車灣休閑景區","南宮山","天書峽景區","漢江燕翔洞景區","飛渡峽-黃安壩景區","千層河",}
18     City["西安市區"]=[]string{"新城區","碑林區","蓮湖區","灞橋區","未央區","雁塔區","閻良區","臨潼區","長安區","高陵區","咸陽區"}
19     City["安康市區"]=[]string{"漢濱區","漢陰縣","石泉縣","寧陝縣","紫陽縣","嵐皋縣","平利縣","鎮平縣","旬陽縣","白河縣",}
20     Province["陝西"]=City
21     City["西安景區"] = Scenery["西安"]
22     City["安康景區"] = Scenery["安康"]
23     for k,v := range Province{
24         fmt.Println(k,v)
25         for x,y := range v{
26             fmt.Println(x,y)
27         }
28     }
29 }
30 
31 
32 
33 
34 #以上代碼執行結果如下:
35 陝西 map[安康市區:[漢濱區 漢陰縣 石泉縣 寧陝縣 紫陽縣 嵐皋縣 平利縣 鎮平縣 旬陽縣 白河縣] 西安景區:[秦始皇兵馬俑 大雁塔 大唐芙蓉園 華清池 黃巢堡國家森林公園 西安碑林博物館 驪山國家森林公園 西安城牆 秦始皇陵 翠華山] 安康景區:[中壩大峽谷 香溪洞 安康雙龍生態旅游度假區 瀛湖生態旅游景區 簡車灣休閑景區 南宮山 天書峽景區 漢江燕翔洞景區 飛渡峽-黃安壩景區 千層河] 西安市區:[新城區 碑林區 蓮湖區 灞橋區 未央區 雁塔區 閻良區 臨潼區 長安區 高陵區 咸陽區]]
36 西安景區 [秦始皇兵馬俑 大雁塔 大唐芙蓉園 華清池 黃巢堡國家森林公園 西安碑林博物館 驪山國家森林公園 西安城牆 秦始皇陵 翠華山]
37 安康景區 [中壩大峽谷 香溪洞 安康雙龍生態旅游度假區 瀛湖生態旅游景區 簡車灣休閑景區 南宮山 天書峽景區 漢江燕翔洞景區 飛渡峽-黃安壩景區 千層河]
38 西安市區 [新城區 碑林區 蓮湖區 灞橋區 未央區 雁塔區 閻良區 臨潼區 長安區 高陵區 咸陽區]
39 安康市區 [漢濱區 漢陰縣 石泉縣 寧陝縣 紫陽縣 嵐皋縣 平利縣 鎮平縣 旬陽縣 白河縣]

 

四.map的進階知識

1.map的挖坑

  Captial["北京"]["大興區"]會發現這個值已經沒有了,取而代之的是Captial["北京"]["密雲縣"]這是因為 Area 和 County 都是 map[string]int 類型的數據,Golang 直接把 ["大興區"] 里的數據從 Area 替換成了 County,而不會遞歸地添加 map 中缺失的數據。

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     Captial := make(map[string]map[string]int)
14     Area := make(map[string]int)
15     Area["大興區"] = 100
16     Captial["北京"] = Area
17     County := make(map[string]int)
18     County["密雲縣"] = 200
19     fmt.Println(Captial["北京"]["大興區"]) //目前是可以訪問到“Captial["北京"]["大興區"]”的值的
20     Captial["北京"] = County
21     fmt.Println(Captial["北京"]["大興區"]) //但是你執行了上一行的代碼,你會發現你訪問不到它的值100啦,但是你卻發現可以訪問下面一行代碼的值。
22     fmt.Println(Captial["北京"]["密雲縣"])
23 }
24 
25 
26 
27 
28 #以上代碼執行結果如下:
29 100
30 0
31 200

2.map的填坑

  你自己想到上面的解決方法了沒?其實很簡單,我們只要做一個條件判斷即可,代碼如下:

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     Captial := make(map[string]map[string]int)
14     Area := make(map[string]int)
15     Area["大興區"] = 100
16     Captial["北京"] = Area
17 
18     if _, ok := Captial["北京"]; ok {
19         Captial["北京"]["密雲縣"] = 200  //判斷,如果存在Captial["北京"]這個key就只做字典的追加操作。
20     }else {
21         County := make(map[string]int)
22         Captial["北京"] = County
23         County["密雲縣"] = 200 //如果不存在就
24     }
25     fmt.Println(Captial["北京"]["大興區"]) //可以訪問到“Captial["北京"]["大興區"]”的值100啦。
26     fmt.Println(Captial["北京"]["密雲縣"])
27 }
28 
29 
30 
31 #以上代碼執行結果如下:
32 100
33 200

 

3.定義一個集合的思想

  了解過Python的童鞋,可能聽說過集合,但是我要告訴你一個好消息和一個壞消息,你想先聽哪一個?壞消息就是Golang沒有集合這個概念;好消息是我們可以用Golang的make函數來實現集合的思想,下面跟我一起看個例子吧!

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import "fmt"
11 
12 func main() {
13     set := make(map[string]bool) //定義一個map
14     set["yinzhengjie"] = true              //給已經存在的變量定義為真
15     if set["yinzhengjie"] {
16         fmt.Printf("已經存在明為yinzhengjie的key,其值為【%v】\n",set["yinzhengjie"])
17 
18     } else {
19         fmt.Println("該變量不存在!")
20     }
21 
22     if set["yzj"] {    //判斷是否 存在變量
23         fmt.Println("已經存在該變量")
24 
25     } else {
26         fmt.Printf("不存在名為“yzj”的key,其值為【%v】\n",set["yzj"])
27 
28     }
29     fmt.Println(set)  //我們來一起查看一下這個網站吧。
30 }
31 
32 
33 
34 
35 #以上代碼執行結果如下:
36 已經存在該變量key,其值為【true】
37 不存在名為“yzj”的key,其值為【false】
38 map[yinzhengjie:true]

 

4.map的尋址

   golang中的map並沒有保證它們的value值的地址是不可變的,因為value值的地址很有可能被重新分配。在golang中,一個容量不斷增長的map可能會導致原來map中的一些元素發生rehashing,使得他們被重新分配到新的storage location上,這樣可能會導致原先得到的address變得不可用。就是所謂的map member 的 not addresable。

  換句話說,在golang設計的時候,map中的value值應該是地址不可達的,就是說直接取map中的元素的地址會報錯.一個修改的辦法就是把value值設置成為指針的形式,這樣就相當於添加了一個額外的記錄(entry),即使真正需要的那個值的位置發生了變化,也可以重定向(redirection)過去。

 1 /*
 2 #!/usr/bin/env gorun
 3 @author :yinzhengjie
 4 Blog:http://www.cnblogs.com/yinzhengjie/tag/GO%E8%AF%AD%E8%A8%80%E7%9A%84%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
 5 EMAIL:y1053419035@qq.com
 6 */
 7 
 8 package main
 9 
10 import (
11     "fmt"
12 )
13 
14 type NameType struct {  //定義一個結構體,類似Python語言中定義一個類的概念。
15     Blog string
16 }
17 
18 func main() {
19     BlogAddress := make(map[string]*NameType)
20     BlogAddress["yinzhengjie"] = &NameType{} //這里賦值的是指針。
21     BlogAddress["yinzhengjie"].Blog = "http://www.cnblogs.com/yinzhengjie"
22     fmt.Println(BlogAddress)
23 }
24 
25 
26 
27 
28 #以上代碼執行結果如下:
29 map[yinzhengjie:0xc042008230]

 

5.擴展小知識:make和new的區別

   make 只能為 slice、map或 channel 類型分配內存並初始化,同時返回一個有初始值的 slice、map 或 channel 類型引用,不是指針。內建函數 new 用來分配內存,它的第一個參數是一個類型,不是一個值,它的返回值是一個指向新分配類型零值的指針。

 

 

 

 

 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM