Golang基礎(一)-- slice用法和本質(zhì)

今天問題問的很基礎,考察了很多概念性問題,有些沒有答上來,自己做一下筆記

Q1:Golang里哪些是值類型,哪些是引用類型

A1:Golang中只有三種引用類型:slice(切片)、map(字典)、channel(管道);

關聯(lián)知識:slice用法和本質(zhì):

轉(zhuǎn)自:https://studygolang.com/articles/5877、
數(shù)組
Go的切片是在數(shù)組之上的抽象數(shù)據(jù)類型,因此在了解切片之前必須要要理解數(shù)組。
數(shù)組類型由指定和長度和元素類型定義。例如,
[4]int 類型表示一個四個整數(shù)的序列。數(shù)組的長度是固定的,長度是數(shù)組類型的一部分(int[4] 和 [5]int 是完全不同的類型)。
數(shù)組可以以常規(guī)的索引方式訪問,表達式 s[n] 訪問數(shù)組的第n 個元素。
數(shù)組不需要顯式的初始化;數(shù)組元素會自動初始化為零值:

切片

數(shù)組雖然有適用它們的地方,但是數(shù)組不夠靈活,因此在Go代碼中數(shù)組使用的并不多。但是,切片則使用得相當廣泛。切片基于數(shù)組構建,但是提供更強的功能和便利。
切片的類型是 []T,T 是切片元素的類型。和數(shù)組不同的是,切片沒有固定的長度。

切片的本質(zhì)

一個切片是一個數(shù)組切割區(qū)間的描述。它包含了指向數(shù)組的指針,切割區(qū)間的長度,和容量(切割區(qū)間的最大長度)。

可能的“陷阱”

正如前面所說,切片操作并不會復制底層的數(shù)組。此層的數(shù)組將被保存在內(nèi)存中,知道它不再被引用。有時候可能會因為一個小的內(nèi)存引用導致保存所有的數(shù)據(jù)。

例如,F(xiàn)indDigits 函數(shù)加載整個文件到內(nèi)存,然后搜索第一個連續(xù)的數(shù)字,最后結果以切片方式返回。

var digitRegexp = regexp.MustCompile("[0-9]+")

func FindDigits(filename string) []byte {
    b, _ := ioutil.ReadFile(filename)
    return digitRegexp.Find(b)
}

這段代碼的行為和廣告類似,返回的 []byte 指向保存整個文件的數(shù)組。因為切片引用了原始的數(shù)組,導致GC不能釋放數(shù)組的空間;一個小的需求導致需要保存整個文件。
(切片引用了原始數(shù)組,切片操作不會影響到底層數(shù)組,返回以后導致GC不能釋放數(shù)組空間。所以修復這個問題需要將切片拷貝到一個新的切片中,舊數(shù)組在方法返回時就會釋放)
要修復整個問題,可以將感興趣的數(shù)據(jù)復制到一個新的切片中:

func CopyDigits(filename string) []byte {
    b, _ := ioutil.ReadFile(filename)
    b = digitRegexp.Find(b)
    c := make([]byte, len(b))
    copy(c, b)
    return c
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容