大數據開發-Go-數組,切片

new()和make的區別

兩者看起來沒什麼區別,可是他們的行爲不一樣,分別適用於不一樣的類型數組

  • new (T) 爲每一個新的類型 T 分配一片內存,初始化爲 0 而且返回類型爲 * T 的內存地址:這種方法 返回一個指向類型爲 T,值爲 0 的地址的指針,它適用於值類型如數組和結構體;它至關於 &T{}。app

  • make(T) 返回一個類型爲 T 的初始值,它只適用於 3 種內建的引用類型:切片、map 和 channel函數

bytes包

類型 []byte 的切片十分常見,Go 語言有一個 bytes 包專門用來解決這種類型的操做方法,好比bytes的buffer,就提供Read和Write的方法,讀寫未知長度的bytes時候最好用buffer,下面的例子相似於Java的StringBuilder的append方法大數據

var buffer bytes.Buffer
for {
    if s, ok := getNextString(); ok { //method getNextString() not shown here
        buffer.WriteString(s)
    } else {
        break
    }
}
fmt.Print(buffer.String(), "\n")

slice重組

知道切片建立的時候一般比相關數組小,例如:ui

slice1 := make([]type, start_length, capacity)

其中 start_length 做爲切片初始長度而 capacity 做爲相關數組的長度。人工智能

這麼作的好處是咱們的切片在達到容量上限後能夠擴容。改變切片長度的過程稱之爲切片重組 reslicing,作法以下:slice1 = slice1[0:end],其中 end 是新的末尾索引(即長度),若是想增長切片的容量,咱們必須建立一個新的更大的切片並把原分片的內容都拷貝過來指針

package main
import "fmt"

func main() {
    sl_from := []int{1, 2, 3}
    sl_to := make([]int, 10)

    n := copy(sl_to, sl_from)
    fmt.Println(sl_to)
    fmt.Printf("Copied %d elements\n", n) // n == 3

    sl3 := []int{1, 2, 3}
    sl3 = append(sl3, 4, 5, 6)
    fmt.Println(sl3)
}

注意: append 在大多數狀況下很好用,可是若是你想徹底掌控整個追加過程,你能夠實現一個這樣的 AppendByte 方法:code

func AppendByte(slice []byte, data ...byte) []byte {
    m := len(slice)
    n := m + len(data)
    if n > cap(slice) { // if necessary, reallocate
        // allocate double what's needed, for future growth.
        newSlice := make([]byte, (n+1)*2)
        copy(newSlice, slice)
        slice = newSlice
    }
    slice = slice[0:n]
    copy(slice[m:n], data)
    return slice
}

Slice的相關應用

假設 s 是一個字符串(本質上是一個字節數組),那麼就能夠直接經過 c := []byte(s) 來獲取一個字節的切片 c。另外還能夠經過 copy 函數來達到相同的目的:copy(dst []byte, src string) ,使用 substr := str[start:end] 能夠從字符串 str 獲取到從索引 start 開始到 end-1 位置的子字符串排序

package main

import "fmt"

func main() {
    s := "\u00ff\u754c"
    for i, c := range s {
        fmt.Printf("%d:%c ", i, c)
    }
}

在內存中,一個字符串其實是一個雙字結構,即一個指向實際數據的指針和記錄字符串長度的整數(見圖 7.4)。由於指針對用戶來講是徹底不可見,所以咱們能夠依舊把字符串看作是一個值類型,也就是一個字符數組。索引

字符串 string s = "hello" 和子字符串 t = s[2:3]

  • 修改字符串

    • Go 語言中的字符串是不可變的,也就是說 str[index] 這樣的表達式是不能夠被放在等號左側的,若是必需要修改,必需要先將字符串轉爲字節數組,而後經過修改元素值來達到修改字符串的目的,最後要講字節數組轉回字符串格式
  • 字符串對比函數

    • Compare 函數會返回兩個字節數組字典順序的整數對比結果
  • 搜索及排序切片和數組

    • 標準庫提供了 sort 包來實現常見的搜索和排序操做。您可使用 sort 包中的函數 func Ints(a []int) 來實現對 int 類型的切片排序
  • 切片和垃圾回收

    切片的底層指向一個數組,該數組的實際容量可能要大於切片所定義的容量。只有在沒有任何切片指向的時候,底層的數組內存纔會被釋放,這種特性有時會致使程序佔用多餘的內存
    吳邪,小三爺,混跡於後臺,大數據,人工智能領域的小菜鳥。
    更多請關注
    file

相關文章
相關標籤/搜索