GoLang基礎數據類型--->數組(array)詳解


                   GoLang基礎數據類型--->數組(array)詳解

                                              作者:尹正傑

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

 

 

一.Golang數組簡介  

 數組是Go語言編程中最常用的數據結構之一。顧名思義,數組就是指一系列同一類型數據的集合。數組中包含的每個數據被稱為數組元素(element),一個數組包含的元素個數被稱為數組的長度。換句話說,與其他大多數語言類似,Go語言的數組也是一個元素類型相同的定長的序列。

 

二.定義數組

   在Go語言中,數組長度在定義后就不可更改,在聲明時長度可以為一個常量或者一個常量表達式(常量表達式是指在編譯期即可計算結果的表達式)。數組的長度是該數組類型的一個內置常量,可以用Go語言的內置函數len()來獲取。

 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     "strings"
12     "fmt"
13     "reflect"
14 )
15 
16 func main() {
17     var   golang_array  [5]string //定義一個長度為5的字符串數組。我們可以用一個定義數組的公式:“var golang_array [n]type ”, n表示數組長度,type表示數組存儲類型。
18     line := "yinzhengjie is a good boy"
19     list := strings.Split(line, " ")  //將字符串切割成相應的一個切片。
20     for k,v := range list{
21         golang_array[k] = v //將切片的每一個值賦值給我們剛剛定義的長度為5的數組。
22     }
23     fmt.Println(reflect.TypeOf(list)) //查看list的數據類型
24     fmt.Println(golang_array)
25     fmt.Println(reflect.TypeOf(golang_array)) 
26 }
27 
28 
29 
30 #以上代碼執行結果如下:
31 []string
32 [yinzhengjie is a good boy]
33 [5]string

 

三.常見的數組聲明方法

 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  new struct {
13     x,y int64
14 }
15 
16 var (
17      Golang_bytes_array [10]byte   //聲明長度為5的數組,每個元素為一個字節;
18      Golang_pointer_array  [5]*int //指針數組
19      Golang_two_dimensional_array  [2][3]int  //二維數組
20      Golang_three_dimensional_array [2][3][4]int //三維數組,等同於[2]([3]([4]int))
21      Golang_string_array   [5]string //字符串數組
22      Golang_dynamic_array = [...]int{1,2,3,4} //這種方法需要進行賦值操作。
23 )
24 
25 func main() {
26     fmt.Println(Golang_bytes_array)
27     fmt.Println(Golang_pointer_array)
28     fmt.Println(Golang_two_dimensional_array)
29     fmt.Println(Golang_three_dimensional_array)
30     fmt.Println(Golang_string_array)
31     fmt.Println(Golang_dynamic_array)
32 }
33 
34 
35 
36 #以上代碼執行結果如下:
37 [0 0 0 0 0 0 0 0 0 0]
38 [<nil> <nil> <nil> <nil> <nil>]
39 [[0 0 0] [0 0 0]]
40 [[[0 0 0 0] [0 0 0 0] [0 0 0 0]] [[0 0 0 0] [0 0 0 0] [0 0 0 0]]]
41 [    ]
42 [1 2 3 4]

 

四.數組初始化

 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     Golang_two_dimensional_array := [2][5]string{{"a","b"},{"c","d"}} //進行初始化,當然還可以這樣寫:Golang_two_dimensional_array := [...][5]string{{"a","b"},{"c","d"}}
14     res := Golang_two_dimensional_array
15     for _,v := range res    {
16         for x,y := range v{
17             fmt.Println(x,y)
18         }
19     }
20     fmt.Println(Golang_two_dimensional_array)
21 }
22 
23 
24 
25 
26 #以上代碼執行結果如下:
27 0 a
28 1 b
29 2 
30 3 
31 4 
32 0 c
33 1 d
34 2 
35 3 
36 4 
37 [[a b   ] [c d   ]]

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 (
11     "fmt"
12 )
13 
14 func main() {
15     Golang_Multidimensional_array := [...][3][10]string{   //該行效果等同於:"Golang_Multidimensional_array := [3][3][10]string",這不過我那樣寫可以動態擴展,沒有把參數寫死。
16         {
17             {
18                 "中華名族園","北京奧林匹克公園","國家體育館","中國科學技術官","奧林匹克公園網球場","蟹島綠色生態農庄","國家游泳中心(水立方)","中國紫檀博物館","北京歡樂谷","元大都城",
19             },
20             {
21                 "北京野生動物園","男孩子麋鹿苑","中華文化園","留民營生態農場","中國印刷博物館","北普陀影視城","大興濱河森林公園","呀路古熱帶植物園","龐各庄萬畝梨園","西黃垈村",
22             },
23             {
24                 "頤和園","北京大學","西山八大處","圓明園遺址公園","中央廣播電視塔","北京植物園","紫竹院公園","鳳凰嶺","香山公園","王淵潭",
25             },
26         },
27         {
28             {
29                 "秦始皇兵馬俑","大雁塔","大唐芙蓉園","華清池","黃巢堡國家森林公園","西安碑林博物館","驪山國家森林公園","西安城牆","秦始皇陵","翠華山",
30             },
31             {
32                 "中壩大峽谷","香溪洞","安康雙龍生態旅游度假區","瀛湖生態旅游景區","簡車灣休閑景區","南宮山","天書峽景區","漢江燕翔洞景區","飛渡峽-黃安壩景區","千層河",
33             },
34             {
35                 "西柏坡紅色旅游區","嶂石岩","天桂山","天山海世界","五岳塞","駝梁山","辛集國際皮革城","東方巨龜苑","白鹿溫泉度假中心","靈壽秋山景區",
36             },
37         },
38         {
39             {
40                 //此處的字符串未填寫,感興趣的朋友可以繼續寫下去;
41             },
42             {
43                 //此處的字符串未填寫,感興趣的朋友可以繼續寫下去;
44             },
45             {
46                 //此處的字符串未填寫,感興趣的朋友可以繼續寫下去;
47             },
48         },
49     }
50 
51     fmt.Println(Golang_Multidimensional_array)
52 
53     for i:=0;i<50 ;i++  {
54         fmt.Print("*")
55     }
56     fmt.Print("我是分割線")
57     for i:=0;i<50 ;i++  {
58         fmt.Print("*")
59     }
60     fmt.Println()
61 
62     for k,v := range Golang_Multidimensional_array{
63         fmt.Println(k,v)
64         //for x,y := range v{
65         //    fmt.Println(x,y)
66         //}
67     }
68 }
69 
70 
71 
72 #以上代碼執行結果如下:
73 [[[中華名族園 北京奧林匹克公園 國家體育館 中國科學技術官 奧林匹克公園網球場 蟹島綠色生態農庄 國家游泳中心(水立方) 中國紫檀博物館 北京歡樂谷 元大都城] [北京野生動物園 男孩子麋鹿苑 中華文化園 留民營生態農場 中國印刷博物館 北普陀影視城 大興濱河森林公園 呀路古熱帶植物園 龐各庄萬畝梨園 西黃垈村] [頤和園 北京大學 西山八大處 圓明園遺址公園 中央廣播電視塔 北京植物園 紫竹院公園 鳳凰嶺 香山公園 王淵潭]] [[秦始皇兵馬俑 大雁塔 大唐芙蓉園 華清池 黃巢堡國家森林公園 西安碑林博物館 驪山國家森林公園 西安城牆 秦始皇陵 翠華山] [中壩大峽谷 香溪洞 安康雙龍生態旅游度假區 瀛湖生態旅游景區 簡車灣休閑景區 南宮山 天書峽景區 漢江燕翔洞景區 飛渡峽-黃安壩景區 千層河] [西柏坡紅色旅游區 嶂石岩 天桂山 天山海世界 五岳塞 駝梁山 辛集國際皮革城 東方巨龜苑 白鹿溫泉度假中心 靈壽秋山景區]] [[         ] [         ] [         ]]]
74 **************************************************我是分割線**************************************************
75 0 [[中華名族園 北京奧林匹克公園 國家體育館 中國科學技術官 奧林匹克公園網球場 蟹島綠色生態農庄 國家游泳中心(水立方) 中國紫檀博物館 北京歡樂谷 元大都城] [北京野生動物園 男孩子麋鹿苑 中華文化園 留民營生態農場 中國印刷博物館 北普陀影視城 大興濱河森林公園 呀路古熱帶植物園 龐各庄萬畝梨園 西黃垈村] [頤和園 北京大學 西山八大處 圓明園遺址公園 中央廣播電視塔 北京植物園 紫竹院公園 鳳凰嶺 香山公園 王淵潭]]
76 1 [[秦始皇兵馬俑 大雁塔 大唐芙蓉園 華清池 黃巢堡國家森林公園 西安碑林博物館 驪山國家森林公園 西安城牆 秦始皇陵 翠華山] [中壩大峽谷 香溪洞 安康雙龍生態旅游度假區 瀛湖生態旅游景區 簡車灣休閑景區 南宮山 天書峽景區 漢江燕翔洞景區 飛渡峽-黃安壩景區 千層河] [西柏坡紅色旅游區 嶂石岩 天桂山 天山海世界 五岳塞 駝梁山 辛集國際皮革城 東方巨龜苑 白鹿溫泉度假中心 靈壽秋山景區]]
77 2 [[         ] [         ] [         ]]

 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 (
11     "fmt"
12     "strings"
13 )
14 
15 var   (
16     yinzhengjie [5]string    //聲明變量
17 )
18 
19 func main() {
20     str := "a,b,c,d,e"
21     list := strings.Split(str,",")
22     for k,v := range list{
23         yinzhengjie[k] = v  //在上面通過“var”關鍵字提前聲明了變量,現在我們只需要進行初始化就成。注意是沒有加“:”喲!
24     }
25     fmt.Println(yinzhengjie)
26 }
27 
28 
29 
30 #以上代碼執行結果如下:
31 [a b c d e]

 

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     var  a [2]int  //先聲明變量類型
14     a[0] = 100  //對已經聲明的
15     b := [5]byte{'a','b','c','d','e'} //聲明並初始化一個長度為“5”的字節(“uint8”)數組
16     c := [3]int{1,22,333}
17     d := [...]int{1,2,3,4}  //可以省略長度而采用`...`的方式,Golang會自動根據元素個數來計算長度,
18     e := [...]int{10:666}  //不指定長度,對第“11”個元素(下標為10)賦值“66619     f := [2][3]int{[3]int{1,2,3},[3]int{4,5,6}}
20     g := [2][3]int{{100,200,300},{400,500,500}} //如果內部的元素和外部的一樣,那么上面的聲明可以簡化,直接忽略內部的,因為都是“int”型
21     fmt.Println(a)
22     fmt.Println(b)
23     fmt.Println(c)
24     fmt.Println(d)
25     fmt.Println(e)
26     fmt.Println(f)
27     fmt.Println(g)
28 }
29 
30 
31 
32 
33 #以上代碼執行結果如下:
34 [100 0]
35 [97 98 99 100 101]
36 [1 22 333]
37 [1 2 3 4]
38 [0 0 0 0 0 0 0 0 0 0 666]
39 [[1 2 3] [4 5 6]]
40 [[100 200 300] [400 500 500]]

 5.數組的花式定義和賦值

 

 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     var   num [5]int  //先定義一個容量為5的數組num。
14     num = [5]int{1,3,5,7,9} //給這num數組賦值
15     fmt.Printf("num數組的元素是:%d\n",num)
16 
17     var   a [3]int = [3]int{1,2,3} //將一個容量為三長度也為3的數組賦值給另一個容量為三的數組.
18     fmt.Printf("a數組的元素是:%d\n",a)
19     fmt.Printf("a[1]所對應的值是:%d\n",a[1]) //表示取a數組下標對應是1的value.
20     fmt.Printf("a數組的容量是:%d,該容量的長度是:%d,還可以存取%d個成員\n",cap(a),len(a),(cap(a)-len(a))) //cap函數用於計算數組的容量,len函數用於計算數組的長度.
21 
22 
23     b := [...]int{1,2,3,4} //這種定義方式其實就是不寫具體的容量參數,那么容量的值就和長度是相等的。
24     fmt.Printf("b數組的元素是:%d\n",b)
25     fmt.Printf("該數組的容量是:%d,該容量的長度是:%d,還可以存取%d個成員\n",cap(b),len(b),(cap(b)-len(b)))
26 
27     c := [...]int{4:20,7:-1}  //定義下標為4的值為20,下標為7的值為-1。給指定數組下標賦初值,數組的長度為最大下標的加1,如果一個數組沒有寫明容量的話,會根據其下標最大的元素來定義其容量和長度。
28     fmt.Printf("c數組的元素是:%d\n",c)
29     fmt.Printf("該數組的容量是:%d,該容量的長度是:%d,還可以存取%d個成員\n",cap(c),len(c),(cap(c)-len(c)))
30 }
31 
32 
33 
34 
35 #以上代碼執行結果如下:
36 num數組的元素是:[1 3 5 7 9]
37 a數組的元素是:[1 2 3]
38 a[1]所對應的值是:2
39 a數組的容量是:3,該容量的長度是:3,還可以存取0個成員
40 b數組的元素是:[1 2 3 4]
41 該數組的容量是:4,該容量的長度是:4,還可以存取0個成員
42 c數組的元素是:[0 0 0 0 20 0 0 -1]
43 該數組的容量是:8,該容量的長度是:8,還可以存取0個成員

 

 

 

五.數組訪問方式

1.通過range訪問

 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     Number := [6]int{100,200,300,400,500,600}
14     for k,v := range Number{
15         fmt.Printf("Number[%d]=%d\n",k,v)  //range具有兩個返回值,第一個返回值i是元素的數組下標,第二個返回值v是元素的值。
16     }
17 }
18 
19 
20 
21 
22 #以上代碼執行結果如下:
23 Number[0]=100
24 Number[1]=200
25 Number[2]=300
26 Number[3]=400
27 Number[4]=500
28 Number[5]=600

 

2.通過for循環來訪問

 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     Number := [6]int{100,200,300,400,500,600}
14     for i := 0;i < len(Number) ;i++  {
15         fmt.Printf("Number[%d]=[%d]\n",i,Number[i])
16     }
17 }
18 
19 
20 
21 #以上代碼執行結果如下:
22 Number[0]=[100]
23 Number[1]=[200]
24 Number[2]=[300]
25 Number[3]=[400]
26 Number[4]=[500]
27 Number[5]=[600]

 六.數組進階知識

1.數組的內存大小以及內存地址的查看

    在Go語言中數組是一個值類型(value type)。是真真實實的數組,而不是一個指向數組內存起始位置的指針,也不能和同類型的指針進行轉化,這一點嚴重不同於C語言。所有的值類型變量在賦值和作為參數傳遞時都將產生一次復制動作。我們來看下面這個案例:

 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     "unsafe"
13 )
14 
15 func main() {
16     Number := [...]int{100,200,300,400,500,600}
17     fmt.Printf("Number的元素是:%d\n",Number)
18     fmt.Printf("Number所占內存大小是:[%d]bytes\n",unsafe.Sizeof(Number)) //長度為“1”的數組所占內存大小是“8”字節。
19 
20     var n1,n2  int64
21     n1 = 100
22     n2 = n1  //所有的值類型變量在賦值和作為參數傳遞時都將產生一次復制動作。知識把值給copy走了。
23     fmt.Printf("n1所對應的值是:[%d],n1的內存地址是:[%d]\n",n1,&n1)
24     fmt.Printf("n2所對應的值是:[%d],n2的內存地址是:[%d]\n",n2,&n2)
25 }
26 
27 
28 
29 
30 #以上代碼執行結果如下:
31 Number的元素是:[100 200 300 400 500 600]
32 Number所占內存大小是:[48]bytes
33 n1所對應的值是:[100],n1的內存地址是:[825741263336]
34 n2所對應的值是:[100],n2的內存地址是:[825741263344]

 2.作用域-數組值傳遞

  如果將數組作為函數的參數類型,則在函數調用時該參數將發生數據復制。因此,在函數體中無法修改傳入的數組的內容,因為函數內操作的只是所傳入數組的一個副本。當然,你也可以理解成作用域的不用,導致數據無法修改。更多關於Golang和C的數組區別可以點擊這里

 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 Update(Golang_array [4]int) [4]int {
13     Golang_array[0] = 100
14     fmt.Printf("我在Update函數里面:Golang_array的值是%v\n",Golang_array)
15     return Golang_array
16 }
17 
18 func main() {
19     Golang_array := [...]int{1,2,3,4}
20     res := Update(Golang_array)  //將Golang_array數組交給該函數處理。
21     fmt.Println("Update處理結果是:",res)
22     fmt.Printf("我在main函數里面:Golang_array的值是%v\n",Golang_array) //這里要注意的是,它在main函數中的作用域當中,所以它拿不到Update作用域的“Golang_array”
23 }
24 
25 
26 
27 #以上代碼執行結果如下:
28 我在Update函數里面:Golang_array的值是[100 2 3 4]
29 Update處理結果是: [100 2 3 4]
30 我在main函數里面:Golang_array的值是[1 2 3 4]

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     var   num [5]int  //先定義一個容量為5的數組num。
14     num = [5]int{1,3,5,7,9} //給這num數組賦值
15     fmt.Printf("num數組的元素是:%d\n",num)
16     var   a [3]int = [3]int{1,2,3} //將一個容量為三長度也為3的數組賦值給另一個容量為三的數組.
17     fmt.Printf("a數組的元素是:%d\n",a)
18     fmt.Printf("a[1]所對應的值是:%d\n",a[1]) //表示取a數組下標對應是1的value.
19     fmt.Printf("a數組的容量是:%d,該容量的長度是:%d,還可以存取%d個成員\n",cap(a),len(a),(cap(a)-len(a))) //cap函數用於計算數組的容量,len函數用於計算數組的長度.
20     b := [...]int{1,2,3,4} //這種定義方式其實就是不寫具體的容量參數,那么容量的值就和長度是相等的。
21     fmt.Printf("b數組的元素是:%d\n",b)
22     fmt.Printf("該數組的容量是:%d,該容量的長度是:%d,還可以存取%d個成員\n",cap(b),len(b),(cap(b)-len(b)))
23     c := [...]int{4:20,7:-1}  //定義下標為4的值為20,下標為7的值為-1。給指定數組下標賦初值,數組的長度為最大下標的加1,如果一個數組沒有寫明容量的話,會根據其下標最大的元素來定義其容量和長度。
24     fmt.Printf("c數組的元素是:%d\n",c)
25     fmt.Printf("該數組的容量是:%d,該容量的長度是:%d,還可以存取%d個成員\n",cap(c),len(c),(cap(c)-len(c)))
26 }
27 
28 
29 
30 
31 #以上代碼執行結果如下:
32 num數組的元素是:[1 3 5 7 9]
33 a數組的元素是:[1 2 3]
34 a[1]所對應的值是:2
35 a數組的容量是:3,該容量的長度是:3,還可以存取0個成員
36 b數組的元素是:[1 2 3 4]
37 該數組的容量是:4,該容量的長度是:4,還可以存取0個成員
38 c數組的元素是:[0 0 0 0 20 0 0 -1]
39 該數組的容量是:8,該容量的長度是:8,還可以存取0個成員

 


免責聲明!

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



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