golang数组与切片

golang中坑的慢慢踩!

golang中的数组是值类型,函数调用是传入的是数组的拷贝,如果想改变数组的值,可考虑使用指针数组,即函数调用时传入数组的地址

golang中的切片是引用类型,但是在函数中使用append给切片追加元素是行不通的,需要使用切片的指针类型才能增加元素

数组的使用:

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, ",")
    }
}

运行结果:

数组的特点:
1、长度固定,无法扩容 (记住)
2、数组是值类型,也就是说在作为参数时,函数体中无法修改传入的数组的值

切片特点:
1、长度不固定、可以追加元素(append),在追加时可能使切片的容量增大
2、切片是引用类型
切片slice的数据结构:一个指向真实array数组地址的指针ptr,slice的长度len和容量cap

当在使用 append 的时候,如果 cap==len 了这个时候就会新开辟一块更大内存,然后把之前的数据复制过去,ptr所指向的地址指向新的内存地址
在实际使用中,我们最好事先预期好一个cap,这样在使用append的时候可以避免反复重新分配内存复制之前的数据,减少不必要的性能消耗。

 

转载于:https://www.cnblogs.com/xbblogs/p/10063308.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值