今天問題問的很基礎,考察了很多概念性問題,有些沒有答上來,自己做一下筆記
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
}