golang數組與切片

golang中坑的慢慢踩!golang

golang中的數組是值類型,函數調用是傳入的是數組的拷貝,若是想改變數組的值,可考慮使用指針數組,即函數調用時傳入數組的地址數組

golang中的切片是引用類型,可是在函數中使用append給切片追加元素是行不通的,須要使用切片的指針類型才能增長元素數據結構

數組的使用:app

package main

import (
    "fmt"
)

func ChangeArr(arr [5]int) {
    arr[0] = 6
}

func ChangeArr2(arr *[5]int) {
    arr[0] = 6
}

func main() {
    a := [5]int{1, 2, 3, 4, 5}
    PrintArr(a)
    ChangeArr(a)
    PrintArr(a)
    ChangeArr2(&a)
    PrintArr(a)
}

func PrintArr(arr [5]int) {

    fmt.Println("\n打印數組:")
    for _, v := range arr {
        fmt.Print(v, ",")
    }
}

運行結果:函數

 

切片的使用:性能

package main

import (
    "fmt"
)

func ChangeArr(arr []int) {
    arr[1] = 20
    arr = append(arr, 8) //此處的元素並無增長到切片
}

func ChangeArr2(arr *[]int) {
    (*arr)[0] = 6          //由於傳入的是切片指針,因此全部使用切片的地方都必須是指針類型的切片(這裏與數組不一樣)
    *arr = append(*arr, 7) //此處的元素添加進了切片
}

func main() {
    a := []int{1, 2, 3, 4, 5}
    PrintArr(a)
    ChangeArr(a)
    PrintArr(a)
    ChangeArr2(&a)
    PrintArr(a)
}

func PrintArr(arr []int) {

    fmt.Println("\n打印切片:")
    for _, v := range arr {
        fmt.Print(v, ",")
    }
}

運行結果:spa

數組的特色:
一、長度固定,沒法擴容 (記住)
二、數組是值類型,也就是說在做爲參數時,函數體中沒法修改傳入的數組的值

切片特色:
一、長度不固定、能夠追加元素(append),在追加時可能使切片的容量增大
二、切片是引用類型
切片slice的數據結構:一個指向真實array數組地址的指針ptr,slice的長度len和容量cap

當在使用 append 的時候,若是 cap==len 了這個時候就會新開闢一塊更大內存,而後把以前的數據複製過去,ptr所指向的地址指向新的內存地址
在實際使用中,咱們最好事先預期好一個cap,這樣在使用append的時候能夠避免反覆從新分配內存複製以前的數據,減小沒必要要的性能消耗。
相關文章
相關標籤/搜索