字符串&數組&切片

一個字符串在內存中究竟什麼樣子? C語言字符串是一個字節數組加一個結束符。Go語言字符串標準結構是指針和長度,指針指向一個字節數組。 數組

爲何要把字符串實現成不可變類型?字符串類型是咱們平常工做當中使用頻率很是高的數據類型,這種類型的特色是不定長的,對於字符串處理每每很是複雜。

好比說多我的使用同一個字符串的時候或者字符串在不一樣函數中傳遞的時候,但願要麼複製、要麼不可變。這樣的好處是無論引用多少次,只須要保留一份副本。當對其進行修改的時候就建立一個新的。 數據結構

字符串數據結構先是有底層字節數組,而後標準頭對象有個指針指向字節數組開始位置,而後有個長度。這樣的結構看上去有點像切片,區別在於沒有容量,由於字符串一旦建立以後,它是隻讀的,沒有擴容的可能。

數組是一個由固定長度的特定類型元素組成的序列,一個數組能夠由零個或多個元素組成。數組的長度是數組類型的組成部分。Go語言中數組是值語義,一個數組變量即表示整個數組,它並非隱式的指向第一個元素的指針(好比C語言的數組),而是一個完整的值。當一個數組變量被賦值或者被傳遞的時候,實際上會複製整個數組。若是數組較大的話,數組的賦值也會有較大的開銷。爲了不復制數組帶來的開銷,能夠傳遞一個指向數組的指針,可是數組指針並非數組。函數

切片是一個很簡單的對數組進行管理的數據結構,可是它自己並非數組,它經過一個指針引用一個數組,自己顯然不是數組,是一個結構體。因此咱們返回切片類型大小的時候,sizeof(type)其實是三個字段相加的結果而不是它引用數組的長度。指針

Go語言中數組、字符串和切片三者是密切相關的數據結構。這三種數據類型,在底層有着相同的內存結構,在上層,由於語法的限制而有着不一樣的行爲表現。首先,Go語言的數組是一種值類型,雖然數組的元素能夠被修改,可是數組自己的賦值和函數傳參都是以總體複製的方式處理的。Go語言字符串底層也是對應的字節數組,可是字符串的只讀屬性禁止了在程序對底層字節數組元素的修改。字符串賦值只是複製了數據地址和對應的長度,而不會致使底層數據的複製。切片的行爲更爲靈活,切片的結構和字符串結構相似,可是解除了只讀限制。切片的底層數據雖然也是對應數據類型的數組,可是每一個切片還有獨立的長度和容量信息,切片賦值和函數傳參數時也是將切片頭信息部分按傳值方式處理。由於切片頭含有底層數據的指針,因此它的賦值也不會致使底層數據的複製。cdn

相關文章
相關標籤/搜索