Go 語言數(shù)組和切片的區(qū)別
在 Go 語言中,數(shù)組和切片看起來很像,但其實(shí)它們又有很多的不同之處,這篇文章就來說說它們到底有哪些不同。
另外,這個(gè)問題在面試中也經(jīng)常會被問到,屬于入門級題目,看過文章之后,相信你會有一個(gè)很好的答案。
數(shù)組
數(shù)組是同一種數(shù)據(jù)類型元素的集合,數(shù)組在定義時(shí)需要指定長度和元素類型。
例如:[4]int? 表示一個(gè)包含四個(gè)整數(shù)的數(shù)組,數(shù)組的大小是固定的。并且長度是其類型的一部分([4]int? 和 [5]int 是不同的、不兼容的類型)。
數(shù)組元素可以通過索引來訪問,比如表達(dá)式 s[n]? 表示訪問第 n 個(gè)元素,索引從零開始。
聲明以及初始化
函數(shù)參數(shù)
如果數(shù)組作為函數(shù)的參數(shù),那么實(shí)際傳遞的是一份數(shù)組的拷貝,而不是數(shù)組的指針。這也就意味著,在函數(shù)中修改數(shù)組的元素是不會影響到原始數(shù)組的。
切片
數(shù)組的使用場景相對有限,切片才更加常用。
切片(Slice)是一個(gè)擁有相同類型元素的可變長度的序列。它是基于數(shù)組類型做的一層封裝。它非常靈活,支持自動(dòng)擴(kuò)容。
切片是一種引用類型,它有三個(gè)屬性:指針,長度和容量。
- 指針:指向 slice 可以訪問到的第一個(gè)元素。
- 長度:slice 中元素個(gè)數(shù)。
- 容量:slice 起始元素到底層數(shù)組最后一個(gè)元素間的元素個(gè)數(shù)。
底層源碼定義如下:
聲明以及初始化
函數(shù)參數(shù)
當(dāng)切片作為函數(shù)參數(shù)時(shí),和數(shù)組是不同的,如果一個(gè)函數(shù)接受一個(gè)切片參數(shù),它對切片元素所做的更改將對調(diào)用者可見,類似于將指針傳遞給了底層數(shù)組。
再看一下上面的例子,把參數(shù)由數(shù)組變成切片,Add? 函數(shù)中的修改會影響到 main 函數(shù)。
總結(jié)
最后來總結(jié)一下,面試時(shí)也可以這么來回答:
- 數(shù)組是一個(gè)長度固定的數(shù)據(jù)類型,其長度在定義時(shí)就已經(jīng)確定,不能動(dòng)態(tài)改變;切片是一個(gè)長度可變的數(shù)據(jù)類型,其長度在定義時(shí)可以為空,也可以指定一個(gè)初始長度。
- 數(shù)組的內(nèi)存空間是在定義時(shí)分配的,其大小是固定的;切片的內(nèi)存空間是在運(yùn)行時(shí)動(dòng)態(tài)分配的,其大小是可變的。
- 當(dāng)數(shù)組作為函數(shù)參數(shù)時(shí),函數(shù)操作的是數(shù)組的一個(gè)副本,不會影響原始數(shù)組;當(dāng)切片作為函數(shù)參數(shù)時(shí),函數(shù)操作的是切片的引用,會影響原始切片。
- 切片還有容量的概念,它指的是分配的內(nèi)存空間。
以上就是本文的全部內(nèi)容,如果覺得還不錯(cuò)的話歡迎點(diǎn)贊,轉(zhuǎn)發(fā)和關(guān)注,感謝支持。
參考文章:
- https://go.dev/doc/effective_go#arrays
- https://go.dev/blog/slices-intro
- https://levelup.gitconnected.com/go-programming-array-vs-slice-5902b7fdd436