1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Golang數(shù)據(jù)類型之?dāng)?shù)組

        共 4234字,需瀏覽 9分鐘

         ·

        2021-06-27 19:59

        目錄

        • 1、存儲(chǔ)方式

        • 2、聲明與初始化

          • 2.1 聲明語(yǔ)法

          • 2.2 數(shù)組類型

          • 2.3 數(shù)組默認(rèn)值

          • 2.4 聲明并初始化

        • 3、訪問(wèn)與修改

        • 4、指針數(shù)組

        • 5、數(shù)組拷貝

        • 6、數(shù)組遍歷

        • 7、多維數(shù)組

        • 8、數(shù)組作為函數(shù)參數(shù)


        有過(guò)Python、JavaScript編程經(jīng)驗(yàn)的人都知道其數(shù)組是動(dòng)態(tài)的,可以隨需求自動(dòng)增大數(shù)組長(zhǎng)度,而Go里面的數(shù)組長(zhǎng)度卻是固定的,無(wú)法擴(kuò)大或者縮小

        Go中也有類似的動(dòng)態(tài)"數(shù)組",稱為切片slice

        Go中的數(shù)組是slicemap兩種數(shù)據(jù)類型的基礎(chǔ),這兩種數(shù)據(jù)類型的底層都是通過(guò)數(shù)組實(shí)現(xiàn)的

        1、存儲(chǔ)方式

        當(dāng)在Go中聲明一個(gè)數(shù)組之后,會(huì)在內(nèi)存中開(kāi)辟一段固定長(zhǎng)度的、連續(xù)的空間存放數(shù)組中的各個(gè)元素,這些元素的數(shù)據(jù)類型完全相同,可以是內(nèi)置的簡(jiǎn)單數(shù)據(jù)類型(int、string等),也可以是自定義的struct`結(jié)構(gòu)體類型

        • 固定長(zhǎng)度:這意味著數(shù)組不可增長(zhǎng)、不可縮減。想要擴(kuò)展數(shù)組,只能創(chuàng)建新數(shù)組,將原數(shù)組的元素復(fù)制到新數(shù)組
        • 連續(xù)空間:這意味可以在緩存中保留的時(shí)間更長(zhǎng),搜索速度更快,是一種非常高效的數(shù)據(jù)結(jié)構(gòu),同時(shí)還意味著可以通過(guò)數(shù)值index的方式訪問(wèn)數(shù)組中的某個(gè)元素
        • 數(shù)據(jù)類型:意味著限制了每個(gè)block中可以存放什么樣的數(shù)據(jù),以及每個(gè)block可以存放多少字節(jié)的數(shù)據(jù)

        例如,使用下面的語(yǔ)句聲明一個(gè)長(zhǎng)度為4int類型的數(shù)組,那么這個(gè)數(shù)組最多只能存放4個(gè)元素,且所有元素都只能是int類型。同時(shí),還為這個(gè)數(shù)組做了初始化

        array := [4]int{314,1 }

        2、聲明與初始化

        2.1 聲明語(yǔ)法

        Go語(yǔ)言數(shù)組聲明需要指定元素類型及元素個(gè)數(shù),語(yǔ)法格式如下

        var variable_name [SIZE] variable_type

        比如聲明一個(gè)長(zhǎng)度為5, 類型是float64的數(shù)組

        var arrayf [5]float64

        2.2 數(shù)組類型

        雖然稱呼數(shù)組為int類型的數(shù)組,但數(shù)組的數(shù)據(jù)類型是兩部分組成的[n]TYPE,這個(gè)整體才是數(shù)組的數(shù)據(jù)類型。所以,[4]int[5]int是兩種不同的數(shù)組類型

        var (
            a1 [4]int
            a2 [5]int
        )
        fmt.Println(reflect.TypeOf(a1))
        fmt.Println(reflect.TypeOf(a2))

        2.3 數(shù)組默認(rèn)值

        當(dāng)一個(gè)變量被聲明之后, 都會(huì)立即賦予一個(gè)默認(rèn)值, 數(shù)組的默認(rèn)值和數(shù)組的數(shù)據(jù)類型有關(guān)

        var a1 [5]int
        fmt.Println(a1) // [0 0 0 0 0]
        var a2 [4]string
        fmt.Println(a2) // [   ]

        2.4 聲明并初始化

        如果不想填充默認(rèn)值, 可以聲明時(shí)就賦值

        a1 := [3]int{123}
        fmt.Println(a1)
        // 如果將元素個(gè)數(shù)指定為特殊符號(hào)...,則表示通過(guò)初始化時(shí)的給定的值個(gè)數(shù)來(lái)推斷數(shù)組長(zhǎng)度
        a2 := [...]int{1234}
        fmt.Println(a2)
        a3 := [...]int{111}
        fmt.Println(a3)
        // 如果聲明數(shù)組時(shí),只想給其中某幾個(gè)元素初始化賦值,則使用索引號(hào)
        a4 := [4]int{0135}
        fmt.Println(a4)

        3、訪問(wèn)與修改

        可以通過(guò)數(shù)組的索引訪問(wèn)數(shù)組的值

        a := [4]int{0125}
        fmt.Println(a[0])
        fmt.Println(a[2])

        同理可通過(guò)數(shù)組的索引修改數(shù)組的值

        a[0] = 10
        a[3] = 20
        fmt.Println(a[0])
        fmt.Println(a[3])

        4、指針數(shù)組

        可以聲明一個(gè)指針類型的數(shù)組,這樣數(shù)組中就可以存放指針。注意,指針的默認(rèn)初始化值為nil

        例如,創(chuàng)建int類型指針的數(shù)組

        a := [4]*int{0new(int), 3new(int)}
        fmt.Println(a)
        // [0xc00001c2a8 <nil> <nil> 0xc00001c2b0]

        // 如果指針地址為空, 是會(huì)報(bào)空指針錯(cuò)誤的, 比如
        // *a[1] = 3
        // panic: runtime error: invalid memory address or nil pointer dereference

        *a[0] = 10
        *a[3] = 20
        fmt.Println(a)
        fmt.Println(*a[0], *a[3])

        // 為1賦值
        a[1] = new(int)
        *a[1] = 30
        fmt.Println(a, *a[1])

        5、數(shù)組拷貝

        Go中,由于數(shù)組算是一個(gè)值類型,所以可以將它賦值給其它數(shù)組 因?yàn)閿?shù)組類型的完整定義為[n]TYPE,所以數(shù)組賦值給其它數(shù)組的時(shí)候,nTYPE必須相同

        修改 a2 數(shù)組元素的值,不會(huì)影響 a1 數(shù)組

        例如:

        a1 := [4]string{"a""b""c""m"}
        a2 := [4]string{"x""y""z""n"}
        a1 = a2
        fmt.Println(a1, a2)

        數(shù)組賦值給其它數(shù)組時(shí),實(shí)際上是完整地拷貝一個(gè)數(shù)組。所以,如果數(shù)組是一個(gè)指針型的數(shù)組,那么拷貝的將是指針數(shù)組,而不會(huì)拷貝指針?biāo)赶虻膶?duì)象

        a1 := [4]*string{new(string), new(string), new(string), new(string)}
        a2 := a1
        fmt.Println(a1, a2)

        *a1[0] = "A"
        *a1[1] = "B"
        *a1[2] = "C"
        *a1[3] = "D"
        fmt.Println(*a1[0], *a2[0])
        // A A

        6、數(shù)組遍歷

        range關(guān)鍵字可以對(duì)array進(jìn)行迭代,每次返回一個(gè)index和對(duì)應(yīng)的元素值??梢詫?code style="font-size: 14px;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(150, 84, 181);">range的迭代結(jié)合for循環(huán)對(duì)array進(jìn)行遍歷

        a := [4]int{1234}
        for i, v := range a {
            fmt.Println(i, v)
        }
        /*
        0 1
        1 2
        2 3
        3 4
        */

        7、多維數(shù)組

        可以通過(guò)組合兩個(gè)一維數(shù)組的方式構(gòu)成二維數(shù)組, 二維數(shù)據(jù)還是比較常用,

        比如定義坐標(biāo), 表示4個(gè)坐標(biāo)(1,1) (2,2) (3,3) (4,4)

        // pos := [4][2]int{{1, 1}, {2, 2}, {3, 3}, {4, 4}}
        fmt.Println(pos)
        // [[1 1] [2 2] [3 3] [4 4]]

        // 修改第一點(diǎn)的坐標(biāo)
        pos[0] = [2]int{1010}
        fmt.Println(pos)

        // [[10 10] [2 2] [3 3] [4 4]]

        8、數(shù)組作為函數(shù)參數(shù)

        Go中的傳值方式是按值傳遞,這意味著給變量賦值、給函數(shù)傳參時(shí),都是直接拷貝一個(gè)副本然后將副本賦值給對(duì)方的。這樣的拷貝方式意味著:

        • 如果數(shù)據(jù)結(jié)構(gòu)體積龐大,則要完整拷貝一個(gè)數(shù)據(jù)結(jié)構(gòu)副本時(shí)效率會(huì)很低
        • 函數(shù)內(nèi)部修改數(shù)據(jù)結(jié)構(gòu)時(shí),只能在函數(shù)內(nèi)部生效,函數(shù)一退出就失效了,因?yàn)樗薷牡氖歉北緦?duì)象

        示例

        func TestMain1(t *testing.T) {
         payload := [4]int{1}
         fmt.Printf("%p\n", &payload)  // 0xc00014a040
         change(payload)  // 0xc00014a060
        }

        func change(payload [4]int) {
         fmt.Printf("%p\n", &payload)
         payload[0] = 10
        }
        瀏覽 62
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人三A级做爰无码视频 | 九哥草逼网 | 欧美国产另类 | 啪啪啪啪网 | 色五月丁香欧美综合 | 黄色电影视| 偷拍自拍第一页 | 欧美成人无码在线 | 久久人体视频 | 四虎国产成人永久精品免费 |