1. 程式人生 > >golang的slice了解及驗證

golang的slice了解及驗證

一個 等等 fmt self make 大小 UNC 代碼 包括

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)

golang的slice了解及驗證