zoukankan      html  css  js  c++  java
  • Go学习笔记-数组和切片

    数组

    数组是具有相同唯一类型的一组已编号且长度固定的数据项序列(同构的数据结构);这种类型可以是任意的原始类型,例如整型、字符串或者自定义类型。

    数组长度必须是一个常量表达式,并且必须是一个非负整数。

    数组成都也是数组类型的一部分,所以[5]int和[10]int是属于不同类型的。

    数组是一种值类型。

    数组的编译时,值初始化时按照数组顺序完成的

    知识扩展:1.PHP中的数组实际上是一个有序映射。映射是一种把values关联到keys的类型;2.C语言中的数组是指向首元素的指针

    声明的格式:var identifier [len]type。例如: var arr1 [5]int。

    数组的特点:
    • 这种类型可以是任意的原始类型,例如整型,字符串,自定义类型。
    • 数组长度必须是一个常量表达式,并且是一个非负数
    • 数组长度也是数组类型的一部分
    数组长度的特点:
    • 数组索引从0开始
    • 元素的数目,也称为长度或者数组大小必须是固定的并且在声明该数组时就给出
    • 数组长度最大为2Gb

     备注:Go语言中的数组是一种值类型(C/C++中是指向首元素的指针)。Go中的数组可以用new()来创建:var arr1 = new([5]int),这种方式创建出来的数组arr1的类型是*[5]int,而arr2的类型是[5]int。当把数组作为参数传给函数是,会产生一次赋值,函数就不会修改原始数组。

    arr1 := new([3]int)
    arr2 := arr1
    arr2[1] = 23
    fmt.Println(arr1[1]) // 结果为23,因为arr1的类型是*[3]int
    
     数组的变化形式
    1 var arr1 = [5]int{1,2,3,4,5} // 也是写成[5]int{1,2}其他位置的值默认0
    2 var arr2 = [...]int{1,2,3,4,5} // 从技术上说变成了切片
    3 var arr3 = [5]string{2:'kobe',3:'paul'} // 索引23被赋值

     切片

    切片(slice)是对数组一个连续片段的引用(该数组我们称之为相关数组,通常是匿名的),所以切片时一个引用类型。

    声明切片的格式是:var identifier []type (备注:不需要说明其长度

    切片在未初始化之前为nil,长度为0。

    切片的特点

    • 切片可以是整个数组,或者是由其实和终止索引标识的一些项的子集(备注:终止索引标识的项不包括在切片内)
    • 切片时可索引额,并且可以由len()函数获取长度
    • 切片可以在运行时修改,最小为0最大为相关数组的长度(备注:切片可以理解成长度可变的数组,但这么说本质上是不对的,形式上是)
    • 切片提供了计算容量的函数cap()可以测量切片最长可以达到多少。强调:切片长度永远不会超过其容量(备注:容量的它所在数组的长度)
    • 因为切片是一个数组中的一部分,也就是说一个数组可以有多个切片,那么这些切片就是共享这个数组的数据。
    • 切片是引用类型,所以不需要额外的存储空间,因此比数组的效率高

    切片的创建

    var slice1 = []int{1,2,3,4} // 创建了一个长度为4的数组,并创建了一个相关切片
    var slice2 = make([]int,5) // make([]type,len,cap)(cap可选参数)
    var slice3 = new([]int) // slice3=nil,切片没有被初始化,make()创建的会直接初始化。

    切片的原理

      在内存中是一个3个域的结构体:指向相关数组的指针,切片长度及切片容量。

      

    使用make生成切片的原理

      方式 var slice1 := make([]type,len,cap)  参数分别是切片类型,切片长度,切片容量。cap参数可选,如果忽略的话,默认创建的切片len=cap

    1 //这两种方法生成相同的切片,切片是引用类型,所以他们类型也是相同的 
    2  make([]int,50,100)
    3  new([100]int)[0:50]

      make()方法生成的切片的内存结构

      

  • 相关阅读:
    在客户端模拟调用srv和topic
    直流电机测试标准
    vue项目修改host实现地址代理,实现一键登录
    小程序 日期格式化
    ES6学习笔记之async函数
    ES6学习笔记之promise
    ES6学习笔记之箭头函数
    ES6学习笔记之var,let,const
    axios post后台接收不到参数
    vue-cli2配置scss遇到的各种坑
  • 原文地址:https://www.cnblogs.com/ymkfnuiwgij/p/8660071.html
Copyright © 2011-2022 走看看