• Go语言学习笔记(4)——数组和切片


    1.数组的特点: 长度固定、元素数据类型相同、下标从0开始

    1.1 声明和初始化: 

    var array_name [size] type
    var arr1 [10] float32
    var arr2 = [5]int{1, 2, 3, 4, 5}   // {}中元素的个数不能大于[]中的数字
    // 如果忽略[]中的数字,即不设置数组大小,则会根据元素个数自动设置大小
    // 可以通过 len(array) 求得数组array的长度。
    // 可以将声明时数组的长度替换为x[...], 让编译器为你找到长度---- a := [...]int{6, 12, 24, 36}


    1.2 遍历数组:

    for i := 0; i<len(array); i++ {}
    for i, v := range array {}          //其中i是索引,v是对应的元素
    for _, v := range array {}         //只获得数组值,而不要下标


    1.3 多维数组:

    var array = [3][4] int {
                            {1, 2, 3, 4},
                            {5, 6, 7, 8},
                            {9, 10, 11, 12} }


    1.4 Go中的数组是值变量(值传递):当使用数组给其他变量或者数组赋值时,是将原始数组的拷贝分配给新变量/数组;如果对新变量/数组进行更改,则不会影响原始数组!(即使 数组作为参数传递!)
                                    


    2.切片: 切片是一种方便、灵活且强大的包装器。切片本身没有任何数据,它们只是对现有数组的引用。切片不需要设定长度,即在[]中不需要设定值。
    slice像是一个结构体,这个结构体包含了三个元素:

    • 指针,指向数组中slice指定的开始位置;
    • 长度,即slice的长度;
    • 最大长度,也就是slice开始位置到数组的最后位置的长度。

    2.1 定义切片

    var slice []type;  slice = make([]type, len)
    var slice []type = make([]type, len)        // 简写为: slice := make([]type, len)
    var slice1 = make([]int, len, cap)           // 其中len是切片长度,cap是最大长度!

    初始化 : 未初始化的切片默认值为nil, 长度和最大长度都为0

    array := []int{1, 2, 3, 4, 5} 
    var s []int = array[startIndex : endIndex]
    或者
    s :
    = array[startIndex : endIndex] // 将array从下标startIndex到endIndex-1下的元素(前闭后开) //这就 创建一个新的切片,长度为endIndex-startIndex s := array[:] // 包含数组中所有元素 s := array[startIndex:] // 一直到数组array的最后一个元素 s := array[:endIndex] // 从数组array的第一个元素开始

    2.2 修改切片: slice没有自己的任何数据,它只是底层数组的一个表示。对slice所做的任何修改都将反映在底层数组中。


     2.3 len()和cap函数:  切片是可索引的!

    len(s) --> 求切片s的长度
    
    cap(s) -->求切片s的最大长度/容量(即从startIndex到数组结尾)


     2.4 append()和copy()函数:

    append() --> 向slice里面追加一个或者多个元素,然后返回一个和slice一样类型的slice
     eg: slice = append(slice, 0, 1)   // 向切片slice中添加元素0 和 1

    append函数会改变slice所引用的数组的内容,从而影响到引用同一数组的其它slice。但当slice中没有剩余空间(即(cap-len) == 0)时,此时将动态分配新的数组空间。返回的slice数组指针将指向这个空间, 而原数组的内容保持不变,其它引用此数组的slice也不受影响

    copy() --> 从源slice的src中复制元素到目标slice,并且返回复制的元素的个数. 
    eg: copy(slice1, slice2)
    //
    将slice2中的元素拷贝到slice1中
    ** 其中 slice1 和 slice2 的长度可以不相同:
    当 len(slice1) > len(slice2)时,
    slice2 中的值全部都能用上,用来覆盖 slice1 中的前 len(slice) 个值;
    当 len(slice1) < len(slice2)时,只有 slice2 中的前 len(slice1) 个值会被用上,用来覆盖 slice1 中 的全部值。
    
    

     

    ///纵有疾风起,人生不言弃///
  • 相关阅读:
    高性能MySQL--创建高性能的索引
    error:0906D064:PEM routines:PEM_read_bio:bad base64 decode
    高性能MySQL--MySQL数据类型介绍和最优数据类型选择
    Elasticsearch入门和查询语法分析(ik中文分词)
    裁员浪潮,互联网人该何去何从?
    django+mysql的使用
    很详细的Django入门详解
    (2021年1月5日亲测有效)最新PyCharm 安装教程&激活破解,Pycharm激活,Pycharm破解
    (2021年1月5日更新)!最新的pycharm永久激活办法,亲测有效
    太干了!一张图整理了 Python 所有内置异常
  • 原文地址:https://www.cnblogs.com/skzxc/p/10664976.html
Copyright © 2020-2023  润新知