深入学习golang(1)—数组与切片
数据(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)—数组与切片的更多相关文章
- 学习Golang语言(6):类型--切片
学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Gola ...
- [Golang学习笔记] 07 数组和切片
01-06回顾: Go语言开发环境配置, 常用源码文件写法, 程序实体(尤其是变量)及其相关各种概念和编程技巧: 类型推断,变量重声明,可重名变量,类型推断,类型转换,别名类型和潜在类型 数组: 数组 ...
- go 学习笔记之数组还是切片都没什么不一样
上篇文章中详细介绍了 Go 的基础语言,指出了 Go 和其他主流的编程语言的差异性,比较侧重于语法细节,相信只要稍加记忆就能轻松从已有的编程语言切换到 Go 语言的编程习惯中,尽管这种切换可能并不是特 ...
- golang笔记——数组与切片
一.切片的定义 我们可以从数组(go语言中很少直接使用数组)或者切片来初始化一个新的切片,也可以直接通过 make 来初始化一个所有元素为默认零值的切片. //1.通过数组来初始化切片 arr := ...
- GoLang笔记-数组和切片,本质是就是长度不可变的可变的区别
数组 Arrays 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其长度.当作为方法的入参传入时将复制一份数 ...
- golang之数组与切片
数组 数组可以存放多个同一类型数据,数组也是一种数据类型,在Go中,数组是值类型. 数组的定义: var 数组名 [数组大小]数据类型 var a [5]int 赋初值 a[0] = 1 a ...
- 『GoLang』数组与切片
数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列(这是一种同构的数据结构):这种类型可以是任意的原始类型例如整型.字符串或者自定义类型. 数组长度必须是一个常量表达式,并且必须是一个非负 ...
- golang中数组与切片的区别
初始化:数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变 数组: a := [...],,} a := [],,} 切片: a:= [],,} a := make([]) a := m ...
- Go语言学习笔记(4)——数组和切片
1 数组的特点: 长度固定.元素数据类型相同.下标从0开始 1.1 声明和初始化: var array_name [size] type var arr1 [10] float32 ...
随机推荐
- winform在不同电脑分辨率
private void InitializeComponent() { //设定按字体来缩放控件 this.AutoScaleMode = System.Windows.Forms.AutoScal ...
- jsp标签精华(持续更新中)
<%@ taglib uri="/struts-tags" prefix="s" %> <%@ taglib uri="http:/ ...
- Js 类定义的几种方式
提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...
- php新手常用的函数(随时更新)
//数字保留两位小数 $n = sprintf("%1.2f", $n); //方法二 $n = number_format($n, 2, '.', ''); //UTF8转GBK ...
- JQuery_进阶选择器
在简单选择器外,还有一些进阶的选择器方便我们更精准的选择元素. 1.群组选择器 可以将相同的样式合并 <script type="text/javascript" src=& ...
- Spring <bean> 参数意义
1.id bean的唯一标识, 2.class 类的完全限定名, 3.parent 父类bean定义的名字. 如果没有任何声明,会使用父bean,但是也可以重写父类.重写父类时,子bean 必须与父b ...
- iOS中JS 与OC的交互(JavaScriptCore.framework)
iOS中实现js与oc的交互,目前网上也有不少流行的开源解决方案: 如:react native 当然一些轻量级的任务使用系统提供的UIWebView 以及JavaScriptCore.framewo ...
- SSO之CAS总结
1.采用kerberos原理 2.特点,经纪人模式即需要sso的所有用户账号要集中在一起 3.安全性保证方法: 关键就是保证TS和TGC的安全. 3.1)TS生成是采用足够随机算法,一次性使用,设置有 ...
- 基础知识复习(一)——C语言位运算符详解
常用的位运算符:与(&),取反(~),或(|),异或(^),左移(«),右移(») 1. 与(&)操作符,按位与,全为1 时,结果取1 11001 &10011 结果:1000 ...
- 001_kafka起步
一.简介 Kafka is a distributed, partitioned, replicated commit log service. It provides the functionali ...