Go基礎(chǔ)——Array數(shù)組

概述

1.數(shù)組是同一類型元素的集合侍芝。
2.數(shù)組是有固定長度的鹃锈,因此需要初始化數(shù)組是聲明長度。
3.數(shù)組屬于值類型的缚甩,即將一個(gè)數(shù)組賦值給另外一個(gè)數(shù)組的時(shí)候,實(shí)際上就是將整個(gè)數(shù)組拷貝一份窑邦。

數(shù)組的聲明

數(shù)組的聲明需要指定數(shù)量和存儲(chǔ)數(shù)據(jù)的類型擅威。其表示形式為 [n]Tn 表示數(shù)組中元素的數(shù)量冈钦,T 代表每個(gè)元素的類型郊丛,數(shù)組一旦聲明后,其大小和類型都不能改變。

var <數(shù)組名稱> [<數(shù)組長度>]<元素類型>

eg:

package main

import (
    "fmt"
)

func main() {
    var a [3]int //int array with length 3
    fmt.Println(a)
}

var a[3]int 聲明了一個(gè)長度為 3 的整型數(shù)組宾袜。數(shù)組中的所有元素都被自動(dòng)賦值為數(shù)組類型的零值。在這種情況下驾窟,a 是一個(gè)整型數(shù)組庆猫,因此 a 的所有元素都被賦值為 0,即 int 型的零值绅络。運(yùn)行上述程序?qū)⑤敵?[0 0 0]月培。
數(shù)組的索引從 0 開始到 length - 1 結(jié)束。讓我們給上面的數(shù)組賦值恩急。

package main

import (
    "fmt"
)

func main() {
    var a [3]int //int array with length 3
    a[0] = 10 // array index starts at 0
    a[1] = 20
    a[2] = 50
    fmt.Println(a)
   //輸出 `[10 20 50]`瞎领。
}

指定元素初始化數(shù)組

var <數(shù)組名稱> = [<數(shù)組長度>]<元素類型>{元素1,元素2,...}**

package main

import (
    "fmt"
)

func main() {
    a := [3]int{10, 20, 50} // short hand declaration to create array
    fmt.Println(a)
  //輸出 `[10 20 50]`
}

在簡略聲明中樱拴,不需要將數(shù)組中所有的元素賦值。

package main

import (
    "fmt"
)

func main() {
    a := [3]int{12} 
    fmt.Println(a)
}

在上述程序中的第 8 行 a := [3]int{12} 聲明一個(gè)長度為 3 的數(shù)組,但只提供了一個(gè)值 12墨礁,剩下的 2 個(gè)元素自動(dòng)賦值為 0。這個(gè)程序?qū)⑤敵?code>[12 0 0]蝶俱。

省略號(hào)初始化數(shù)組

數(shù)組的長度可以使用省略號(hào) ... 代替实昨,這個(gè)并不是代表可以省略數(shù)組長度的聲明,編譯器會(huì)自動(dòng)計(jì)算數(shù)組長度窗看,它的長度值等于當(dāng)前數(shù)組初始化元素的個(gè)數(shù)茸歧。

package main

import (
    "fmt"
)

func main() {
    a := [...]int{12, 78, 50} // ... makes the compiler determine the length
    fmt.Println(a)
}

索引初始化數(shù)組

[<數(shù)組長度>]<元素類型>{索引1:元素1,索引2:元素2,…}
const (
    FIRST int = iota
    SECOND
    THIRD
    FOURTH
)

func main() {
    arr :=[4]string{FIRST:"1",SECOND:"2",THIRD:"3",FOURTH:"4"}
    fmt.Println(arr)
}
//輸出[1 2 3 4]

數(shù)組比較

同樣類型的數(shù)組是可以相互賦值的,相同類型的數(shù)組必須是長度一樣显沈,并且每個(gè)元素的類型也一樣的數(shù)組软瞎,因此數(shù)組的大小是類型的一部分。因此 [5]int[25]int 是不同類型拉讯。

package main

func main() {
    a := [3]int{5, 78, 8}
    var b [5]int
    b = a // not possible since [3]int and [5]int are distinct types
}

在上述程序的第 6 行中, 我們?cè)噲D將類型 [3]int 的變量賦給類型為 [5]int 的變量涤浇,這是不允許的,因此編譯器將拋出錯(cuò)誤 main.go:6: cannot use a (type [3]int) as type [5]int in assignment遂唧。

數(shù)組是值類型

Go 中的數(shù)組是值類型而不是引用類型芙代。一個(gè)數(shù)組的變量代表著整個(gè)數(shù)組,不像其他語言指向的是數(shù)組的第一個(gè)元素盖彭,這意味著當(dāng)數(shù)組賦值給一個(gè)新的變量時(shí)纹烹,該變量會(huì)得到一個(gè)原始數(shù)組的一個(gè)副本。如果對(duì)新變量進(jìn)行更改召边,則不會(huì)影響原始數(shù)組铺呵。

package main

import "fmt"

func main() {
    a := [...]string{"USA", "China", "India", "Germany", "France"}
    b := a // a copy of a is assigned to b
    b[0] = "Singapore"
    fmt.Println("a is ", a)
    fmt.Println("b is ", b) 
}

在上述程序的第 7 行,a 的副本被賦給 b隧熙。在第 8 行中片挂,b 的第一個(gè)元素改為 Singapore。這不會(huì)在原始數(shù)組 a 中反映出來。該程序?qū)?輸出

a is [USA China India Germany France]  
b is [Singapore China India Germany France]

同樣音念,當(dāng)數(shù)組作為參數(shù)傳遞給函數(shù)時(shí)沪饺,它們是按值傳遞,而原始數(shù)組保持不變闷愤。

package main

import "fmt"

func changeLocal(num [5]int) {
    num[0] = 55
    fmt.Println("inside function ", num)
}
func main() {
    num := [...]int{5, 6, 7, 8, 8}
    fmt.Println("before passing to function ", num)
    changeLocal(num) //num is passed by value
    fmt.Println("after passing to function ", num)
}

在上述程序的 13 行中, 數(shù)組 num 實(shí)際上是通過值傳遞給函數(shù) changeLocal整葡,數(shù)組不會(huì)因?yàn)楹瘮?shù)調(diào)用而改變。這個(gè)程序?qū)⑤敵?

before passing to function  [5 6 7 8 8]
inside function  [55 6 7 8 8]
after passing to function  [5 6 7 8 8]

數(shù)組的長度

通過將數(shù)組作為參數(shù)傳遞給 len 函數(shù)讥脐,可以得到數(shù)組的長度遭居。

package main

import "fmt"

func main() {
    a := [...]float64{67.7, 89.8, 21, 78}
    fmt.Println("length of a is",len(a))
}

上面的程序輸出為 length of a is 4

使用 range 迭代數(shù)組

for 循環(huán)可用于遍歷數(shù)組中的元素旬渠。

package main

import "fmt"

func main() {
    a := [...]float64{67.7, 89.8, 21, 78}
    for i := 0; i < len(a); i++ { // looping from 0 to the length of the array
        fmt.Printf("%d th element of a is %.2f\n", i, a[i])
    }
}

上面的程序使用 for 循環(huán)遍歷數(shù)組中的元素俱萍,從索引 0length of the array - 1。這個(gè)程序運(yùn)行后打印出告丢,

0 th element of a is 67.70  
1 th element of a is 89.80  
2 th element of a is 21.00  
3 th element of a is 78.00

Go 提供了一種更好枪蘑、更簡潔的方法,通過使用 for 循環(huán)的 range 方法來遍歷數(shù)組芋齿。range 返回索引和該索引處的值腥寇。讓我們使用 range 重寫上面的代碼。我們還可以獲取數(shù)組中所有元素的總和觅捆。

package main

import "fmt"

func main() {
    a := [...]float64{67.7, 89.8, 21, 78}
    sum := float64(0)
    for i, v := range a {//range returns both the index and value
        fmt.Printf("%d the element of a is %.2f\n", i, v)
        sum += v
    }
    fmt.Println("\nsum of all elements of a",sum)
}

上述程序的第 8 行 for i, v := range a 利用的是 for 循環(huán) range 方式赦役。 它將返回索引和該索引處的值。 我們打印這些值栅炒,并計(jì)算數(shù)組 a 中所有元素的總和掂摔。 程序的 輸出是

0 the element of a is 67.70
1 the element of a is 89.80
2 the element of a is 21.00
3 the element of a is 78.00

sum of all elements of a 256.5

如果你只需要值并希望忽略索引赢赊,則可以通過用 _ 空白標(biāo)識(shí)符替換索引來執(zhí)行乙漓。

for _, v := range a { // ignores index  
}

上面的 for 循環(huán)忽略索引,同樣值也可以被忽略释移。

多維數(shù)組

到目前為止我們創(chuàng)建的數(shù)組都是一維的叭披,Go 語言可以創(chuàng)建多維數(shù)組。

package main

import (
    "fmt"
)

func printarray(a [3][2]string) {
    for _, v1 := range a {
        for _, v2 := range v1 {
            fmt.Printf("%s ", v2)
        }
        fmt.Printf("\n")
    }
}

func main() {
    a := [3][2]string{
        {"lion", "tiger"},
        {"cat", "dog"},
        {"pigeon", "peacock"}, // this comma is necessary. The compiler will complain if you omit this comma
    }
    printarray(a)
    var b [3][2]string
    b[0][0] = "apple"
    b[0][1] = "samsung"
    b[1][0] = "microsoft"
    b[1][1] = "google"
    b[2][0] = "AT&T"
    b[2][1] = "T-Mobile"
    fmt.Printf("\n")
    printarray(b)
}

在上述程序的第 17 行玩讳,用簡略語法聲明一個(gè)二維字符串?dāng)?shù)組 a 涩蜘。20 行末尾的逗號(hào)是必需的。這是因?yàn)楦鶕?jù) Go 語言的規(guī)則自動(dòng)插入分號(hào)熏纯。
另外一個(gè)二維數(shù)組 b 在 23 行聲明同诫,字符串通過每個(gè)索引一個(gè)一個(gè)添加。這是另一種初始化二維數(shù)組的方法樟澜。
第 7 行的 printarray 函數(shù)使用兩個(gè) range 循環(huán)來打印二維數(shù)組的內(nèi)容误窖。上述程序的 輸出是

lion tiger
cat dog
pigeon peacock

apple samsung
microsoft google
AT&T T-Mobile

這就是數(shù)組叮盘,盡管數(shù)組看上去似乎足夠靈活,但是它們具有固定長度的限制霹俺,不可能增加數(shù)組的長度柔吼。這就要用到 切片。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丙唧,一起剝皮案震驚了整個(gè)濱河市嚷堡,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌艇棕,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件串塑,死亡現(xiàn)場(chǎng)離奇詭異沼琉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)桩匪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門打瘪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人傻昙,你說我怎么就攤上這事闺骚。” “怎么了妆档?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵僻爽,是天一觀的道長。 經(jīng)常有香客問我贾惦,道長胸梆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任须板,我火速辦了婚禮碰镜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘习瑰。我一直安慰自己绪颖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布甜奄。 她就那樣靜靜地躺著柠横,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贺嫂。 梳的紋絲不亂的頭發(fā)上滓鸠,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音第喳,去河邊找鬼糜俗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悠抹。 我是一名探鬼主播珠月,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼楔敌!你這毒婦竟也來了啤挎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤卵凑,失蹤者是張志新(化名)和其女友劉穎庆聘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勺卢,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伙判,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黑忱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宴抚。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖甫煞,靈堂內(nèi)的尸體忽然破棺而出菇曲,到底是詐尸還是另有隱情,我是刑警寧澤抚吠,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布常潮,位于F島的核電站,受9級(jí)特大地震影響楷力,放射性物質(zhì)發(fā)生泄漏蕊玷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一弥雹、第九天 我趴在偏房一處隱蔽的房頂上張望垃帅。 院中可真熱鬧,春花似錦剪勿、人聲如沸贸诚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酱固。三九已至,卻和暖如春头朱,著一層夾襖步出監(jiān)牢的瞬間运悲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國打工项钮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留班眯,地道東北人希停。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像署隘,于是被迫代替她去往敵國和親宠能。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容