golang的slice瞭解及驗證
阿新 • • 發佈:2018-11-06
golang 中slice的操作
golang收穫
- 如果只是分配了 var st []SelfType, 進行賦值,那麼就會是吧,除非使用 make 分配一個記憶體空間
- 注意, slice在make的時候可以制定 len, cap長度, len,cap的區別在於: len是當前slice中的element的長度, cap是slice的長度(在自動擴充套件之後)
- slice在使用的時候最好要區分出資料量的大小是否可以預期,如果是資料量很大,且不確認會有多少的時候,使用append的時候會浪費時間在記憶體copy了;
- 驗證了一下int8在記憶體的分配
- 0xc000016530 0xc000016531 0xc000016532 0xc000016533 0xc000016534 0xc000016535 0xc000016536 0xc000016537 0xc000016538 0xc000016539 0xc000016528
- 可以看成遞增的值為1, 最後一個差距是 16528, 比16530靠前,分配了兩個byte.
- 驗證了一下int16的記憶體分配
- 0xc000016540 0xc000016542 0xc000016544 0xc000016546 0xc000016548 0xc00001652a
- 連續的記憶體分配, int16是分配兩個byte。
- 驗證了一下int的記憶體分配
- 驗證後知道int與int64一樣,是分配8byte的記憶體地址;
實踐過程
go的slice type是構建在Go's array type的基礎之上。
golang對於slice定義了一組新的格式, 包括比如 []int, [][]int等等 , 這裡有幾個問題?
- 如何定義slice?
- 如何給slice賦值?
- slice支援的格式型別?
- slice在函式呼叫的格式?
- int 的記憶體地址分配大小驗證!
給[]int複製
比較簡單的方法上對[]int的slice進行append處理
func sint() []int { var si []int sii := []int{1,2,3,4} sii = append(sii, 2) sii = append(sii, 3) fmt. for i := 0; i < 10; i++ { si = append(si, i) } return si }
如何給[][]int賦值
通過append的方法, 追加的格式需要上 []int的格式;
func ssint() [][]int {
var ssi [][]int
for i := 0; i < 5; i++ {
si := sint()
ssi = append(ssi, si)
}
return ssi
}
slice通過append進行自動擴充套件的程式碼
可以看到,最後len打印出來的是6, cap打印出來的是8, 原因是在append(sii,2)的時候進行了一次擴充套件;
slice在使用的時候最好要區分出資料量的大小是否可以預期,如果是資料量很大,且不確認會有多少的時候,使用append的時候會浪費時間在記憶體copy了;
sii := []int{1, 2, 3, 4}
sii = append(sii, 2)
sii = append(sii, 3)
fmt.Println(sii, len(sii), cap(sii))
自定義的slice格式
自定義一個selfT的格式,內容為三個串,分別為 Name, Age, No; 以SelfT為基礎進行slice擴充套件
type SelfT struct {
Name string
Age int
No int
}
func sSelfType() {
// var st [2]SelfT
st := make([]SelfT, 2, 5)
st[0] = SelfT{"Pan", 30, 1001}
st[1] = SelfT{"Wan", 31, 1002}
fmt.Println(st)
}
函式呼叫
slice呼叫的時候需要傳地址,這樣就可以在函式內對slice進行操作賦值
func adsi(s *[]int) {
*s = append(*s, 5)
}
驗證int8, int16, int的記憶體分配
通過類似如下的程式碼,看看變數型別在記憶體中的分配;
var i8 [10]int8
var i88 int8
for i = 0; i < 10; i++ {
i8[i] = int8(i)
fmt.Printf("%p ", &i8[i])
}
fmt.Printf("%p ", &i88)