前面讲了变量的有关知识,这里对于其他的数据类型就不多作介绍,(和C差不多),因此重点来讨论下切片。

一、切片是引用类型,这里要稍微介绍两个概念:值类型,构造类型和引用类型

  1、值类型:是一种由类型的实际值表示的数据类型。如果向一个变量分配值类型,则该变量被附以全新的值的副本,go语言的值类型包括布尔型,整型,浮点型,复数型。

  2、构造类型:和c中差不多,包括数组,结构体和字符串

  3、引用类型:由类型的实际值引用表示的数据类型。如果为某个变量分配一个引用类型,则该变量将应用原始值,不创建任何副本。go语言引用类型包括切片、字典和通道。

  切片通常用来实现变长数组,原型定义如下:

struct Slice

{

  byte *array;

  unit32 len;

  unit32 cap;

};

它抽象为以下三个部分:

  指向被引用的底层数组的指针;切片中元素的个数;切片分配的存储空间。

二、切片的创建和声明

  1、基于底层数组创建切片

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

  var slice[]int

  slice1=array1[:5]

  slice2=array1[5:]

  slice3=array1[:]

  slice4=array1

  slice5=array1[0:len(array1)]

  自己添加package和import和func main将上面的代码运行下看看效果,理解基于底层数组创建切片。

  2、直接创建切片

  var slice = []int{1,2,3,4,5}

  3、使用make函数创建切片

  var slice=make([]int,5)//创建一个有5个元素的整型切片slice,元素的初始值为0。

  在使用make()函数创建切片时,还可以为切片元素预留存储空间:

  var slice=make([]int,5,10)//创建一个有5个元素的整型切片slice,元素的初始值为0,并且预留10个元素的存储空间。

三、切片元素的访问和遍历

  切片的访问和数组元素的访问一样,通过元素下表访问,或者使用range遍历所有切片元素.例:

var slice=[]int{1,2,3,4,5}

for i:=0;i<=4;i++{

  fmt.Println(i,slice[i])

}

for i,v:=range slice{

  fmt.Println(i,slice[i])

}

四、切片的操作

  1、切片元素的增加

  使用append()函数向切片尾部添加新元素:

s := make([]string, 3)
fmt.Println("emp:", s)
s[0] = "a"
s[1] = "b"
s[2] = "c" s = append(s, "d")
s = append(s, "e", "f")
fmt.Println("apd:", s)
2、切片的复制:
var slice1=[]int{1,2,3,4,5,6,7,8,9,10}
var slice2=make([]int,3,5)
var n int
n=copy(slice2,slice1)
fmt.Println(n,slice2,len(slice2),cap(slice2)) slice3:=slice[3:6]
n=copy(slice3,slice1[1:5])
fmt.Println(n,slice,slice3)
这段代码需要读者好好研究研究,这可以加深对slice引用的是底层数组的理解,运行的结果是:
3 [1 2 3] 3 5
3[1 2 3 2 3 4 7 8 9 10] [2 3 4]
见下图:

go语言学习之路三:切片的更多相关文章

  1. 12天学好C语言——记录我的C语言学习之路(Day 12)

    12天学好C语言--记录我的C语言学习之路 Day 12: 进入最后一天的学习,用这样一个程序来综合考量指针和字符串的关系,写完这个程序,你对字符串和指针的理解应该就不错了. //输入一个字符串,内有 ...

  2. 12天学好C语言——记录我的C语言学习之路(Day 11)

    12天学好C语言--记录我的C语言学习之路 Day 11: 因为指针部分比较的难,所以我们花费的时间也是最长的,希望大家耐的住性子,多多理解,多多打代码.好了,废话不多说,来看第11天的学习. //编 ...

  3. 12天学好C语言——记录我的C语言学习之路(Day 10)

    12天学好C语言--记录我的C语言学习之路 Day 10: 接着昨天的指针部分学习,有这么一个题目: //还是四个学生,四门成绩,只要有学生一门功课没及格就输出这个学生的所有成绩 /*//progra ...

  4. 12天学好C语言——记录我的C语言学习之路(Day 9)

    12天学好C语言--记录我的C语言学习之路 Day 9: 函数部分告一段落,但是我们并不是把函数完全放下,因为函数无处不在,我们今后的程序仍然会大量运用到函数 //转入指针部分的学习,了解指针是什么 ...

  5. 12天学好C语言——记录我的C语言学习之路(Day 8)

    12天学好C语言--记录我的C语言学习之路 Day 8: 从今天开始,我们获得了C语言中很有力的一个工具,那就是函数.函数的魅力不仅于此,一个程序到最后都是由众多函数组成的,我们一定要用好函数,用熟练 ...

  6. 12天学好C语言——记录我的C语言学习之路(Day 7)

    12天学好C语言--记录我的C语言学习之路 Day 7: 昨天进行了一天的数组学习,今天大家可以先写几个昨天的程序热热身,回顾回顾,然后今天第一个新程序也是关于数组的,比较难,准备好就开始啦! //输 ...

  7. 12天学好C语言——记录我的C语言学习之路(Day 6)

    12天学好C语言--记录我的C语言学习之路 Day 6: 今天,我们要开始学习数组了. //①数组部分,数组的大小不能够动态定义.如下: //int n;   scanf("%d,& ...

  8. 12天学好C语言——记录我的C语言学习之路(Day 5)

    12天学好C语言--记录我的C语言学习之路 Day 5: 第五天的学习开始了,今天我们主要对几个程序进行编写,让自己充分的熟练编程语言,大量的题目会让自己变的精炼.以一个程序(program 5.1) ...

  9. 12天学好C语言——记录我的C语言学习之路(Day 3)

    12天学好C语言--记录我的C语言学习之路 Day 3: 不知不觉到了第三天的学习,我们前两天学习的东西很杂乱,各个方面都有学习.我觉得这不是不系统,也不是学的不扎实,这种学习对于初学者而言我认为是很 ...

随机推荐

  1. CS193p Lecture 7 - Views, Gestures

    Views 如何绘制自定义图像 Gestures 如何处理用户手势操作 Views 1.它是基本的构造块,代表屏幕上一块矩形区域,定义了一个坐标空间,在此空间中可以绘制,可以添加触控事件: 2.它是分 ...

  2. iOS开发遇见的坑之二:工程文件中插件和自身工程命名冲突

    在升级cocoapod后,我重新管理了一下工程,其实也就是把各个类分类进行管理 类似于这样 然后编译就发现不能运行 1.其中一个错误是工程文件缺失,根据提示添加进来进行 2.有一个是pch的相对路径变 ...

  3. C++系统学习之三:向量

    标准库类型vector 定义:vector表示对象的集合,其中所有对象的类型都相同. 访问方式:索引 头文件:<vector> 本质:类模板 NOTE: 模板本身不是类或函数,相反可以将模 ...

  4. 洛谷P1001 A+B Problem

    这道题…………还是很简单!!! code: #include <iostream> #include <cstdio> using namespace std; int mai ...

  5. Git学习——创建本地仓库、提交文件

    创建Git仓库 新建或找一个存在的文件夹,在命令行进入该文件夹,输入命令 git init 添加文件到Git仓库 首先使用命令git add <file>,可以多次添加文件: 使用命令gi ...

  6. [php] 高级教程

    include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码. include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的: require 生成一个 ...

  7. Vector模板类----构造与析构

    /* 基于C++平台*/ typedef int rank; //用int来定义 “秩” 这种概念 #define DEFAULT_CAPACIITY 3 //默认初始容量,实际应用中可以取更大的值 ...

  8. js prototype 添加属性对象

    在本例中,我们将展示如何使用 prototype 属性来向对象添加属性: <script type="text/javascript"> function employ ...

  9. 动态修改字节码以替换用反射调用get set方法的形式

    1. 起因 在前两天,为了解决websphere和JDK8上部署的应用发起webservice调用(框架用的cxf)时报错的问题,跟了一些代码,最终发现可以通过加上参数-Dcom.sun.xml.bi ...

  10. websphere8.5 与cxf2.x冲突问题

    一个客户was部署的小问题,记录一下. 问题现象 在我们的服务中用调用别人的webservice服务报错,框架用的cxf. 报错关键信息有: E com.ibm.ws.webcontainer.web ...