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中

Go语言学习笔记(4)——数组和切片的更多相关文章

  1. [Golang学习笔记] 07 数组和切片

    01-06回顾: Go语言开发环境配置, 常用源码文件写法, 程序实体(尤其是变量)及其相关各种概念和编程技巧: 类型推断,变量重声明,可重名变量,类型推断,类型转换,别名类型和潜在类型 数组: 数组 ...

  2. go 学习笔记之数组还是切片都没什么不一样

    上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特 ...

  3. c语言学习笔记 函数数组传递笔记

    今天学习c语言的一个小例子,果然还是陷入了php的编程习惯里,这里记录一下. #include <stdio.h> //例子很简单,就是编写一个函数把传递进来的数组里的值都赋值为1而已 / ...

  4. C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结

    1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...

  5. C语言学习笔记 (004) - 数组名和数组首地址(转)

    一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址.指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数据起始地址或某一元素的地址放到一个指针变量中) ...

  6. C语言学习笔记之数组与指针的关系

    首先,大家先需知道一个关于基类型的概念 基类型:组成一个新类型的基础类型 这句话是什么意思呢?举个例子: int a[3] = {1,2,3}; 上面是由三个int类型的数组成一个新的类型也就是数组, ...

  7. go语言学习笔记之数组

    package main import ( "fmt" ) func main() { // Declare arrays var x[5] int //Assign value ...

  8. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  9. Go语言学习笔记十一: 切片(slice)

    Go语言学习笔记十一: 切片(slice) 切片这个概念我是从python语言中学到的,当时感觉这个东西真的比较好用.不像java语言写起来就比较繁琐.不过我觉得未来java语法也会支持的. 定义切片 ...

随机推荐

  1. 2018.09.29 bzoj3166: [Heoi2013]Alo(01trie+双向链表)

    传送门 01trie经典题目. 我们可以通过计算每个数作为次小值时对答案的贡献. 显然对于每个iii需要求出一个包含a[i]a[i]a[i]且的区间[l,r][l,r][l,r]且区间所有值都小于a[ ...

  2. 2018.09.24 codeforces 1051F. The Shortest Statement(dijkstra+lca)

    传送门 这真是一道一言难尽的题. 首先比赛的时候居然没想出来正解. 其次赛后调试一直调不出来最后发现是depth传错了. 其实这是一道简单题啊. 对于树边直接lca求距离. 由于非树边最多21条. 因 ...

  3. 在“开始”菜单中的“运行”一栏输入特定命令打开windows程序

    winver 检查Windows版本   wmimgmt.msc 打开Windows管理体系结构(wmi)   wupdmgr Windows更新程序   wscript Windows脚本宿主设置 ...

  4. UVa 11992 Fast Matrix Operations (线段树,区间修改)

    题意:给出一个row*col的全0矩阵,有三种操作 1 x1 y1 x2 y2 v:将x1 <= row <= x2, y1 <= col <= y2里面的点全部增加v: 2 ...

  5. IP之ALTDDIO_in仿真

    需要添加altera_mf库,才可以仿真. 上升沿输出,把前一个时钟的数据输出来. `timescale 1 ns/ 1 ns; module altddio_in_ip_tb; reg rst; r ...

  6. day4之装饰器进阶、生成器迭代器

    装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...

  7. C#-VS字符串、日期、时间和时间段

    小知识 哈希表,内存中的对象,用速度很快的哈希表当字典表,记录主键和内容. @,遇到转义字符,不转义,直接输出,即就是.转义字符是反斜杠/ 全部的内置类型都用类和结构描述.值类型用结构,引用类型用类. ...

  8. 高博-《视觉SLAM十四讲》

    0 讲座 (1)SLAM定义 对比雷达传感器和视觉传感器的优缺点(主要介绍视觉SLAM) 单目:不知道尺度信息 双目:知道尺度信息,但测量范围根据预定的基线相关 RGBD:知道深度信息,但是深度信息对 ...

  9. Codeforces758B Blown Garland 2017-01-20 10:19 87人阅读 评论(0) 收藏

    B. Blown Garland time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  10. git提交提示workspace.xml出现conflicted

    问题:在github上管理项目,多次提交以后提交提示workspace.xml出现conflicted原因:Android项目在根目录的.gitignore文件中没有添加.idea文件夹忽略. 解决办 ...