zoukankan      html  css  js  c++  java
  • Go语言中的数组与数组切片

    Go中的数组与C的数组一样,只是定义方法不同

    c: int a[10][10]

    Go [10][10]int

    定义并初始化 array1 := [5]int{1,2,3,4,5}

    变量名 := [index]类型{也可不加}

    1.元素访问:1.跟C语言一样通过数组来访问

         2.通过关键字range来访问 如:for i,v :=range array{

                        fmt.Printlb(*Array element[",i,"]=*,v)

                       }第一个表示下标从0到len(array)-1

    2.值类型:需要注意的是数组是一个值类型。所有的值类型变量在赋值和作为参数传递的时候都将进行一次复制,会将副本传递过去。所以函数体中无法通过修改传入的数组内容来改变数组。

    3.函数切片:函数切片的数据结构可以抽象为以下三个变量

          {1.一个指向原生数组的指针;

           2.数组切片中的元素个数;

           3.数组切片已分配的存储空间。

    }基于数组,数组切片添加了一系列管理功能,可以随时动态地扩充存放空间,并且可以被随意传递而不会导致所管理的元素被重复复制。

      创建数组切片:

        1.根据基础数组创建(有原数组):

          数组切片可以只使用数组的一部分元素或者整个数组来穿件,甚至可以创建一个比原数组还要大的数组切片。

          支持用mySlice := myArray[first:last]  这种方式来生成数组切片 //同C语言一样是从first到last-1位序列开始。myArray[ : ]表示全部。

         2.直接创造:

          使用Go语言提供的内置函数make()可以用来灵活地创建数组切片如:

            mySlice1 := make([ ]int,5)  //创建了一个有5个初始元素且初始值为0的数组切片

            mySlice2 := make([ ]int,5,10)//同上增加了留十个元素的存储空间

            mySlice3 := [ ]int{1,2,3,4,5}//直接创建并初始化元素的数组切片

          自我归纳:1.make函数可以初始切片并赋值为0和预留存储空间

               2.直接数组切片赋值不用添加make  如 Slice = [ ]类型{}

    2.遍历数组和数组切片:

       1.跟C语言一样通过index访问

       2.使用range函数快速遍历:

          for i,v in range array{

            i为返回值的索引,v为返回元素的值//第一个返回索引,第二个返回元素值

    3.动态增减元素:

      可动态增减元素是数组切片比数组更强大的功能。数组切片多了一个存储力(capacity)的概念=元素个数和分配的空间不同。可以大幅度降低数组切片内部重新分配内存和搬送内存快的频率,大大提高程序性能。因为如果内存大于了原设定的内存,需要CPU重新整一个更大的内存并把原来存储的东西移到新整的内存上面。且CPU并不知道更大为多大所以需要CPU处理多次。

      在此种有Go语言内置函数cap()和len()函数,cap()函数返回的是数组切片的预留空间大小,len()函数顾名思义返回的是已有元素个数。

       如果需要在数列切片中已包含的元素后继续新增元素,可以使用append()函数跟python的比较类似。如:

        mySlice = append(mySlice,1,2,3)  //append()函数的第二个参数其实是一个不定参数,可以自己随意添加若干个元素,甚至于将一个数组切片追加到另一个数组切片末尾:

            mySlice2 := [ ]int{1,2,3}

            mySlice = append(mySlice,mySlice2...)//但是后面需要有省略号,因为在append()函数中从第二个参数起所有的参数都是待附加参数。加上省略号相当于把mySlice2打碎了传入    mySlice = append(mySlice,1,2,3)

            数组切片会自动处理存储空间不足的问题。如果追加的内容长度超过当前已分配的存储空间(既大于cap()的返回值),数组切片会自动分配一个足够大的内存。

    4.基于数组切片创建数组切片:

      如 oldSlice :=[ ]int{1,2,3,4,5}

        newSlice :=oldSlice[ : 3] //跟基于数组来创建数组切片[first:last]

       //newSlice可以创建oldSlice包含的元素,只要不超过oldSlice的cap()函数返回值,超过元素的部分初始化为0

    5.内容复制:

      数组切片支持Go语言的内置函数copy(),用于将内容从一个数组切片复制到另一个数组切片。如果加入的数组切片不一样大,就会按其中较小的你数组切片的元素个数进行复制

      slice1 := []int{1, 2, 3, 4, 5}
      slice2 := []int{6, 7, 8}
      copy(slice1, slice2)//把slice2复制到slice1,但是由于slice2的数量小于slice1所以有多少复制多少

      copy(slice2,slice1)//把slice1复制到slice2,由于slice1数量大于slice2,则只复制前三到slice2

  • 相关阅读:
    Python基础笔记
    Oracle PL/SQL学习之Hello World(0)
    编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)
    编程开发之--Oracle数据库--存储过程和存储函数(2)
    编程开发之--Oracle数据库--存储过程和存储函数(1)
    火车票售票系统
    MySQL 字段内容区分大小写
    json_encode($b, JSON_FORCE_OBJECT) 可以强制转换成对象
    Sublime Text3配置
    springboot-配置多个数据源
  • 原文地址:https://www.cnblogs.com/beautiful7/p/12355242.html
Copyright © 2011-2022 走看看