您好,登錄后才能下訂單哦!
這篇“Go語言數組和切片的區別有哪些”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Go語言數組和切片的區別有哪些”文章吧。
數組是同一種數據類型元素的集合,數組在定義時需要指定長度和元素類型。
例如:[4]int
表示一個包含四個整數的數組,數組的大小是固定的。并且長度是其類型的一部分([4]int
和 [5]int
是不同的、不兼容的類型)。
數組元素可以通過索引來訪問,比如表達式 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] }
如果數組作為函數的參數,那么實際傳遞的是一份數組的拷貝,而不是數組的指針。這也就意味著,在函數中修改數組的元素是不會影響到原始數組的。
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] }
數組的使用場景相對有限,切片才更加常用。
切片(Slice)是一個擁有相同類型元素的可變長度的序列。它是基于數組類型做的一層封裝。它非常靈活,支持自動擴容。
切片是一種引用類型,它有三個屬性:指針,長度和容量。
指針:指向 slice 可以訪問到的第一個元素。
長度:slice 中元素個數。
容量:slice 起始元素到底層數組最后一個元素間的元素個數。
底層源碼定義如下:
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()函數構造切片 fmt.Println(len(nums2), cap(nums2)) // 3 5 }
當切片作為函數參數時,和數組是不同的,如果一個函數接受一個切片參數,它對切片元素所做的更改將對調用者可見,類似于將指針傳遞給了底層數組。
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] }
再看一下上面的例子,把參數由數組變成切片,Add
函數中的修改會影響到 main
函數。
以上就是關于“Go語言數組和切片的區別有哪些”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。