溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go語言數(shù)組和切片的區(qū)別有哪些

發(fā)布時間:2023-05-09 16:28:42 來源:億速云 閱讀:131 作者:iii 欄目:開發(fā)技術(shù)

這篇“Go語言數(shù)組和切片的區(qū)別有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Go語言數(shù)組和切片的區(qū)別有哪些”文章吧。

數(shù)組

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

Go語言數(shù)組和切片的區(qū)別有哪些

例如:[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ù)組的。

Go語言數(shù)組和切片的區(qū)別有哪些

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ù)組類型做的一層封裝。它非常靈活,支持自動擴容。

Go語言數(shù)組和切片的區(qū)別有哪些

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

  • 指針:指向 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ù)

當切片作為函數(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ù)。

以上就是關(guān)于“Go語言數(shù)組和切片的區(qū)別有哪些”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI