数据(array)与切片(slice)

数组声明:

ArrayType   = "[" ArrayLength "]" ElementType .

例如:

var a [32] int

var b [3][5] int

 

在Go和C中,数组的工作方式有几个重要的差别。在Go中,

(1)数组是值类型。将一个数组赋值给另一个,会拷贝所有的元素。

(2) 如果你给函数传递一个数组,其将收到一个数组的拷贝,而不是它的指针。

(3)数组的大小是其类型的一部分,类型[10]int和[20]int是不同的。数组长度在声明后,就不可更改。

 

切片声明:

SliceType = "[" "]" ElementType .

例如:

var a []int

没有初始化的slice为nil。

 

切片(slice)对数组进行封装,实际上,切片可以看成大小可以动态变化的数组,这一点类似C++中std::vector。就像std::vector在实际C++编程中大量使用一样,Go中大多数的数组编程都是通过切片完成,而不是简单数组。

 

一般来说,有两种方式来初始化切片:

(1)通过数组

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

var mySlice []int = myArray[:5]

 

(2)通过make

语法:

make([]T, length, capacity)

 

创建一个初始长度为5,容量为10为切片,切片的每个元素都为0:

slice1 := make([]int, 5, 10)

 

创建一个长度为5的切片,并初始化切片的每个元素:

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

 

对于切片,最重要的特点就是长度是可变的:

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

fmt.Println("slice:", slice2)

 

slice2 = append(slice2, 6)

fmt.Println("slice:", slice2)

 

输出:

slice: [1 2 3 4 5]

slice: [1 2 3 4 5 6]

 

函数append是GO专门为切片增加元素而提供的一个内建函数。

 

切片持有对底层数组的引用,如果你将一个切片赋值给另一个,二者都将引用同一个数组。如果函数接受一个切片作为参数,那么其对切片的元素所做的改动,对于调用者是可见的,好比是传递了一个底层数组的指针。

 

func (f *File) Read(b []byte) (n int, err error)

这个os.File的Read方法,它接受一个切片参数,切片中的长度已经设定了要读取的数据的上限。对于C/C++,需要同时提供一个缓冲区的指针,和缓冲区的大小:

int read(File* f, char* buf, int len)

从这里可以看到,GO的写法要简单一些。

 

切片(数组)的遍历

 

在go语言中,遍历切片或者数组,有两种方式:

 

传统方式:

 

for i := 0; i <len(mySlice); i++ {

fmt.Println("mySlice[", i, "] =", mySlice[i])

}

 

 

 

使用range表达式

 

range表达式有两个返回值,第一个是索引,第二个是元素的值:

 

for i, v := range mySlice {

fmt.Println("mySlice[", i, "] =", v)

}

 

使用range让代码更加简洁,所以在go编程中也更加常用。

作者:YY哥 
出处:http://www.cnblogs.com/hustcat/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

深入学习golang(1)—数组与切片的更多相关文章

  1. 学习Golang语言(6):类型--切片

    学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Gola ...

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

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

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

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

  4. golang笔记——数组与切片

    一.切片的定义 我们可以从数组(go语言中很少直接使用数组)或者切片来初始化一个新的切片,也可以直接通过 make 来初始化一个所有元素为默认零值的切片. //1.通过数组来初始化切片 arr := ...

  5. GoLang笔记-数组和切片,本质是就是长度不可变的可变的区别

    数组 Arrays 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其长度.当作为方法的入参传入时将复制一份数 ...

  6. golang之数组与切片

    数组 数组可以存放多个同一类型数据,数组也是一种数据类型,在Go中,数组是值类型. 数组的定义: var 数组名 [数组大小]数据类型 var a [5]int 赋初值   a[0] = 1    a ...

  7. 『GoLang』数组与切片

    数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列(这是一种同构的数据结构):这种类型可以是任意的原始类型例如整型.字符串或者自定义类型. 数组长度必须是一个常量表达式,并且必须是一个非负 ...

  8. golang中数组与切片的区别

    初始化:数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变 数组: a := [...],,} a := [],,} 切片: a:= [],,} a := make([]) a := m ...

  9. Go语言学习笔记(4)——数组和切片

    1 数组的特点: 长度固定.元素数据类型相同.下标从0开始 1.1 声明和初始化: var array_name [size] type         var arr1 [10] float32   ...

随机推荐

  1. testng依赖,顺序,跳过

    依赖测试@test(dependsOnMethods = {"open"})@testpublic static void open{    System.out.println( ...

  2. PHP匿名函数的使用

    $dealer = array(); array_walk($dealer_id_arr,function($value) use(&$dealer) { $dealer[] = get_co ...

  3. centos 7

    vmlinuz initrd=initrd.img linux dd quiet vmlinuz initrd=initrd.img inst.stage2=hd:/dev/sdb4 quiet 关I ...

  4. .ipynb文件 与ipython notebook

    没有安装ipython notebook 后看见.ipynb文件直接手足无措了 一.安装ipython notebook 使用命令 pip ipython [all] 为所有用户安装 ipython ...

  5. java高薪之路__008_Annotation

    元注解 共有4种 @Retention 表示需要在什么级别保存该注释信息(生命周期) |--- RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉 |--- Reten ...

  6. JDBC连接sql server数据库及其它

    JDBC连接sql server数据库的步骤如下: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.lang.Class类的 ...

  7. 如何解决EditText使用时,点击外侧系统键盘不消失的bug

    在使用viewPager和EditText一起使用的时候,突然出现了一个bug,在点击EditText(此EditText是在ViewPager的Fragment中) 我在切换ViewPager的时候 ...

  8. 利用jsoup进行模拟登录

    因为工作的原因,近段时间开始接触jsoup.大概也弄清了用java来爬网页是怎样一个过程.特此,写篇日志以便他日方便查看. Jsoup是一个java平台的能够对xml文档结构的文档进行解析.有点类似于 ...

  9. 关于H5中自定义属性的设置和获取

    自定义数据属性是在HTML5中新加入的一个特性.简单来说,自定义数据属性规范规定任何以data-开头属性名并且赋值.自定义数据属性是为了保存页面或者应用程序的私有自定义数据,这些自定义数据属性保存进D ...

  10. linux修改密码的几种方法

    1.  启动电脑 ,进入grub模式.  也就是下面这个模式: 按下e键,进入下面这个画面.... 选第二个(kernel的那个):  然后按下e键之后进入 下面这个版面: 之后敲入  single ...