最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go 語言數(shù)組和切片的區(qū)別詳解

 更新時間:2023年04月02日 12:20:02   作者:yongxinz  
本文主要介紹了Go 語言數(shù)組和切片的區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在 Go 語言中,數(shù)組和切片看起來很像,但其實它們又有很多的不同之處,這篇文章就來說說它們到底有哪些不同。

另外,這個問題在面試中也經(jīng)常會被問到,屬于入門級題目,看過文章之后,相信你會有一個很好的答案。

數(shù)組

數(shù)組是同一種數(shù)據(jù)類型元素的集合,數(shù)組在定義時需要指定長度和元素類型。

例如:[4]int 表示一個包含四個整數(shù)的數(shù)組,數(shù)組的大小是固定的。并且長度是其類型的一部分([4]int[5]int 是不同的、不兼容的類型)。

數(shù)組元素可以通過索引來訪問,比如表達式 s[n] 表示訪問第 n 個元素,索引從零開始。

聲明以及初始化

func main() {
    var nums [3]int   // 聲明并初始化為默認零值
    var nums1 = [4]int{1, 2, 3, 4}  // 聲明同時初始化
    var nums2 = [...]int{1, 2, 3, 4, 5} // ...可以表示后面初始化值的長度
    fmt.Println(nums)    // [0 0 0]
    fmt.Println(nums1)   // [1 2 3 4]
    fmt.Println(nums2)   // [1 2 3 4 5]
}

函數(shù)參數(shù)

如果數(shù)組作為函數(shù)的參數(shù),那么實際傳遞的是一份數(shù)組的拷貝,而不是數(shù)組的指針。這也就意味著,在函數(shù)中修改數(shù)組的元素是不會影響到原始數(shù)組的。

package main

import (
    "fmt"
)

func Add(numbers [5]int) {
    for i := 0; i < len(numbers); i++ {
        numbers[i] = numbers[i] + 1
    }
    fmt.Println("numbers in Add:", numbers) // [2 3 4 5 6]
}

func main() {
    // declare and initialize the array
    var numbers [5]int
    for i := 0; i < len(numbers); i++ {
        numbers[i] = i + 1
    }

    Add(numbers)
    fmt.Println("numbers in main:", numbers) // [1 2 3 4 5]
}

切片

數(shù)組的使用場景相對有限,切片才更加常用。

切片(Slice)是一個擁有相同類型元素的可變長度的序列。它是基于數(shù)組類型做的一層封裝。它非常靈活,支持自動擴容。

切片是一種引用類型,它有三個屬性:指針長度容量。

  • 指針:指向 slice 可以訪問到的第一個元素。
  • 長度:slice 中元素個數(shù)。
  • 容量:slice 起始元素到底層數(shù)組最后一個元素間的元素個數(shù)。

底層源碼定義如下:

type slice struct {
    array unsafe.Pointer
    len   int
    cap   int
}

聲明以及初始化

func main() {
    var nums []int  // 聲明切片
    fmt.Println(len(nums), cap(nums)) // 0 0
    nums = append(nums, 1)   // 初始化
    fmt.Println(len(nums), cap(nums)) // 1 1

    nums1 := []int{1,2,3,4}    // 聲明并初始化
    fmt.Println(len(nums1), cap(nums1))    // 4 4

    nums2 := make([]int,3,5)   // 使用make()函數(shù)構(gòu)造切片
    fmt.Println(len(nums2), cap(nums2))    // 3 5
}

函數(shù)參數(shù)

當(dāng)切片作為函數(shù)參數(shù)時,和數(shù)組是不同的,如果一個函數(shù)接受一個切片參數(shù),它對切片元素所做的更改將對調(diào)用者可見,類似于將指針傳遞給了底層數(shù)組。

package main

import (
    "fmt"
)

func Add(numbers []int) {
    for i := 0; i < len(numbers); i++ {
        numbers[i] = numbers[i] + 1
    }
    fmt.Println("numbers in Add:", numbers) // [2 3 4 5 6]
}

func main() {
    var numbers []int
    for i := 0; i < 5; i++ {
        numbers = append(numbers, i+1)
    }

    Add(numbers)

    fmt.Println("numbers in main:", numbers) // [2 3 4 5 6]
}

再看一下上面的例子,把參數(shù)由數(shù)組變成切片,Add 函數(shù)中的修改會影響到 main 函數(shù)。

總結(jié)

最后來總結(jié)一下,面試時也可以這么來回答:

  • 數(shù)組是一個長度固定的數(shù)據(jù)類型,其長度在定義時就已經(jīng)確定,不能動態(tài)改變;切片是一個長度可變的數(shù)據(jù)類型,其長度在定義時可以為空,也可以指定一個初始長度。
  • 數(shù)組的內(nèi)存空間是在定義時分配的,其大小是固定的;切片的內(nèi)存空間是在運行時動態(tài)分配的,其大小是可變的。
  • 當(dāng)數(shù)組作為函數(shù)參數(shù)時,函數(shù)操作的是數(shù)組的一個副本,不會影響原始數(shù)組;當(dāng)切片作為函數(shù)參數(shù)時,函數(shù)操作的是切片的引用,會影響原始切片。
  • 切片還有容量的概念,它指的是分配的內(nèi)存空間。

以上就是本文的全部內(nèi)容,如果覺得還不錯的話歡迎點贊轉(zhuǎn)發(fā)關(guān)注,感謝支持。

參考文章:

 到此這篇關(guān)于Go 語言數(shù)組和切片的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Go 數(shù)組和切片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

平湖市| 文水县| 崇州市| 白河县| 措美县| 渭南市| 麻栗坡县| 拉孜县| 荆州市| 岳阳县| 四子王旗| 富锦市| 黄冈市| 宝清县| 任丘市| 手机| 五河县| 宿松县| 金阳县| 隆昌县| 临海市| 太原市| 荣昌县| 武冈市| 荔波县| 凯里市| 贞丰县| 兴安盟| 吴旗县| 电白县| 亚东县| 云林县| 渑池县| 武功县| 娱乐| 黄骅市| 辛集市| 射阳县| 湄潭县| 武义县| 万载县|