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

原文地址:https://www.cnblogs.com/beautiful7/p/12355242.html

时间: 2024-10-07 18:13:29

Go语言中的数组与数组切片的相关文章

C语言中怎么求动态数组大小

先来个简单的例子 int a[] = {1,2,3}; int arr_len = 0; arr_len = sizeof(a)/sizeof(int); 解释:sizeof() 关键字是求出对象所占用的内存空间的大小,so, sizeof(a)是算出整个数组占用的空间的大小. 因为是整数数组,一个整数在32位系统上占用4个字节,不同的系统数值可能不同, 用sizeof(int)可以计算出 一个整数占用的内存空间大小.所以用sizeof(a)/sizeof(int)数组中有几个整数,也即算出了数

C语言中的函数、数组与指针

1.函数:当程序很小的时候,我们可以使用一个main函数就能搞定,但当程序变大的时候,就超出了人的大脑承受范围,逻辑不清了,这时候就需要把一个大程序分成许多小的模块来组织,于是就出现了函数概念:  函数是C语言代码的基本组成部分,它是一个小的模块,整个程序由很多个功能独立的模块(函数)组成.这就是程序设计的基本分化方法: (1) 写一个函数的关键: 函数定义:函数的定义是这个函数的实现,函数定义中包含了函数体,函数体中的代码段决定了这个函数的功能: 函数声明:函数声明也称函数原型声明,函数的原型

C语言中值得深入知识点----数组做函数参数、数组名a与&a区别、数组名a的"数据类型"

1.数组作为函数参数 C语言中,数组做为函数的参数,退化为指针.数组作为参数传给函数时,传的是指针而不是数组,传递的是数组的首元素的地址.这里我们以将以整形变量排序来讲解. void sortArray(int a[] ,int num )以及void sortArray(int a[100] ,int num )都可以用void sortArray(int *a ,int num )表示.一般来说函数参数如果为数组,可以有两个参数,一个是数组名,一个是数组长度.对于排序而已,一般是要知道给定数

C语言中的指针与数组

1.指针与数组 1)指针与一维数组 i.数组指针(指向数组元素的指针) 类型  *指针变量名: 指针定义完成后要初始化(不想让指向任何内容,=0,=NULL) int a[10]; int *p = &a[0];   // &a[0] == a int *p1 = a; ii.用数组的指针访问数组元素 偏移:指针变量的偏移 p1 = p1+1;    //向下偏移1个一个数组元素 p1++;   //p1中存放的还是地址 .... 如果用指针访问第i个元素 p1+i 取出pi指向的元素的值

C语言中的指针与数组的定义与使用

指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 全局变量 内存映射 可以对内存的内容修改修改硬盘的内容 一般在数据库中经常使用 内存的分配与释放 c语言分配内存的方法 // malloc(需要分配的大小): 这里的分配的大小需要对齐的2的指数 void *mem = malloc(size); 释放内存 // 一般分配的内容都是在堆空间中的 //

深入理解C语言中的指针与数组之指针篇(转载)

前言 其实很早就想要写一篇关于指针和数组的文章,毕竟可以认为这是C语言的根本所在.相信,任意一家公司如果想要考察一个人对C语言的理解,指针和数组绝对是必考的一部分. 但是之前一方面之前一直在忙各种事情,一直没有时间静下心来写这些东西,毕竟这确实是一件非常耗费时间和精力的事情:一方面,个人对C语言的掌握和理解也还有限,怕写出来的东西会对大家造成误导.当然,今天写的这些东西也肯定存在各种问题,不严谨甚至错误的地方肯定有,也希望大家来共同探讨,相互改进. 我会慢慢的写完这几章,有想法的童鞋可以和我探讨

C语言中的指针与数组的关联1

在C语言中,指针是一种类型,存放的是地址,例如char*p,这里p存放的是字符型数据的地址,int*p,p存放的是整形数据的地址,我们可以通过解运用*来获取该地址所指向的内容.而数组则是一种数据类型的集合,如int arr[]={1,2,3,4,5,6,7,8,9,10};这里声明与定义了一个整形数组,而char arr[]="hello world";则是声明与定义了一个字符类型的数组,这个数组内存放的是一个字符串. C语言规定,在大多数情况下数组名其实质就是数组元素的首地址,所以我

直观理解C语言中指向一位数组与二维数组的指针

一维数组和指针: 对于一位数组和指针是很好理解的: 一维数组名: 对于这样的一维数组:int a[5];  a作为数组名就是我们数组的首地址, a是一个地址常量 . 首先说说常量和变量的关系, 对于变量来说, 用箱子去比喻再好不过了, 声明一个变量就声明一个箱子,比如我们开辟出一个苹果类型的箱子, 给这个变量赋值就是把盛放苹果的箱子中放入一个实实在在的苹果, 这就是变量的赋值.  而对于数组来说, 就是一组类型相同的箱子中,一组苹果箱子, 可以放入不同的苹果. 一维数组空间: 变量被声明后, 我

C语言中字符串和字符数组的区别

字符数组: char a[2]={'a','b','c'}; char a[]={'a','b','c'}; 字符串: char a[3]={"abc"}; char a[3]="abc";   //此处可以省略大括号 char a[]="abc";     // 与char a[3]={'a','b','c','\0'};    相同 红字表明的地方为什么要变成3呢,因为字符串赋值给数组后,在最后会默认增加一个字符"\0",

C语言中使用指针与数组的区别

在c语言中,指针和数组名都表示地址,但两者却有很大的不同之处,对于初学者来说一定要弄清楚两者的区别. 首先,我举个简单的例子: char *p1="hello!";  //定义字符型指针p1,并将指针p1指向字符串"hello!"的首地址. char s[10]="hello!";  //定义数组s,并将其初始化赋值. 然而,如果char s[10]; s="hello!";这样就会报错,为什么呢?原因很简单,因为数组名是常量