zoukankan      html  css  js  c++  java
  • 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("
    打印数组:")
        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("
    打印切片:")
        for _, v := range arr {
            fmt.Print(v, ",")
        }
    }

    运行结果:

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

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

    当在使用 append 的时候,如果 cap==len 了这个时候就会新开辟一块更大内存,然后把之前的数据复制过去,ptr所指向的地址指向新的内存地址
    在实际使用中,我们最好事先预期好一个cap,这样在使用append的时候可以避免反复重新分配内存复制之前的数据,减少不必要的性能消耗。
  • 相关阅读:
    Android weight属性详解
    设计模式(一)__单例设计模式
    Java中线程的生命周期
    抽象类和接口
    SQL sever 怎样将DBF文件导入到数据库
    JS去除字符串中空格,及常用正则表达式
    Oracle 11g问题1:关于error:ORA12541: TNS: 没有监听器
    access、excel取随机n条记录
    tsql字符串操作
    测试SQL Server执行时间和CPU时间
  • 原文地址:https://www.cnblogs.com/xbblogs/p/10063308.html
Copyright © 2011-2022 走看看