new()和make的區別
二者看起來沒什麼區別,但是他們的行爲不同,分別適用於不同的類型
-
new (T) 爲每個新的類型 T 分配一片內存,初始化爲 0 並且返回類型爲 * T 的內存地址:這種方法 返回一個指向類型爲 T,值爲 0 的地址的指針,它適用於值類型如數組和結構體;它相當於 &T{}。
-
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重組
知道切片創建的時候通常比相關數組小,例如:
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 方法:
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]
這樣的表達式是不可以被放在等號左側的,如果必須要修改,必須要先將字符串轉爲字節數組,然後通過修改元素值來達到修改字符串的目的,最後要講字節數組轉回字符串格式
- Go 語言中的字符串是不可變的,也就是說
-
字符串對比函數
Compare
函數會返回兩個字節數組字典順序的整數對比結果
-
搜索及排序切片和數組
- 標準庫提供了
sort
包來實現常見的搜索和排序操作。您可以使用sort
包中的函數func Ints(a []int)
來實現對 int 類型的切片排序
- 標準庫提供了
-
切片和垃圾回收
切片的底層指向一個數組,該數組的實際容量可能要大於切片所定義的容量。只有在沒有任何切片指向的時候,底層的數組內存纔會被釋放,這種特性有時會導致程序佔用多餘的內存
吳邪,小三爺,混跡於後臺,大數據,人工智能領域的小菜鳥。
更多請關注