Go语言学习笔记(四) [array、slices、map]

日期:2014年7月22日

一、array[数组]

1、定义:array 由 [n]<type> 定义,n 标示 array 的长度,而 <type> 标示希望存储的内容的类型。

例如:

var arr[10] int

arr[0] = 1

arr[1] = 2

数组值类型的:将一个数组赋值给 另一个数组,会复制所有的元素。另外,当向函数内传递一个数组的时候,它将获得一个数组的副本,而不是数组的指针。

2、数组的复合声明。a :=[3]int{1,2,3}或简写为a:=[...]int{1,2,3}(Go会自动统计元素个数)

3、多维数组

例如:a := [2][2]int{ [2]int{1,2}, [2]int{3,4} } 等价于a := [2][2]int{ [...]int{1,2}, [...]int{3,4} }

在2010-10-27发布版中,当声明的数组的元素类型都一致,那么可以省略内部元素的类型。上面的声明方式可以改写为a := [2][2]int{ {1,2}, {3,4} }

4、数组长度也是类型的一部分,因此具有不同长度的数组,其类型是不同的。

二、slice[切片]

1、slice 与 array 接近,但是在新的元素加入的时候可以增加长度。slice 总是指向底层的一个 array。slice本身不是数组,slice 是一个指向 array的指针,这是其与 array 不同的地方;slice 是引用类型, 这意味着当赋值某个 slice 到另外一个变量,两个引用会指向同一个 array。

2、创建一个slice:sl := make([]<type>,len,cap),cap值可以省略(省略时,值等同于len),len表示存放元素的个数,cap表示容量。容量的大小cap =< real_cap < 2 * cap,当大小超过容量cap时,会容量会自动升级,但是必须说明的是,自动升级后,将会重新分配连续的内存地址。

3、一个slice可以通过a[i:j]的方式创建,新建的slice将会指向a,从i开始,到(j-1)结束,长度=j-i。

4、slice的append操作。slice可以在尾部追加元素,甚至还可以将一个slice追加到另一个slice的尾部,如果最终的长度没有超过原始的slice,那么append操作将返回原来的slice,否则将重新分配内存地址。

5、slice的copy操作。copy操作返回复制的元素的个数,复制的数量是len(src)和len(dst)中最小的值。

6、slice操作的一些示例

a := [6] int {1,2,3,4,5,6} //数组下标从0开始

s1 := a[0:4] //1,2,3,4

s2 := a[:] //1,2,3,4,5,6,是a[0:len(a)]的简写

s3 := a[:3] //1,2,3,是a[0:3]的简写

//s4 := a[1:7] //数组越界,抛出invalid slice index 7 (out of bounds for 6-element array)

s5 := s2[:] //1,2,3,4,5,6,此时的s5和s2依然指向a,可通过内建函数println(slice)打印出结果对比。

s6 := [] int {1}

s7 := append(s6,2)

s8 := append(s7,2,2,3,3)

//s9 := append(s7,s6...) //注意这后面有三个点,不加上的话会报类型错误。我开始还以为是省略号,纠结了半天。

var ar = [...] int {1,2,3,5,6,7}

n1 := copy(s10,ar[0:]) //返回结果 n1=6,此时 s10的值为[1 2 3 5 6 7]

n2 := copy(s10,s10[2:]) //返回结果 n2=4,此时 s10的值为[3 5 6 7 6 7]

关于slice容量扩容重新分配内存地址的问题也没有完全弄明白,以后再补充进来吧。

三、map[字典]

1、map在Go语言中是作为一种内建类型存在。一般定义map的方法为:map[<from type>]<to type>

例如:sexes := map[string]string{

"Man":"男",

"Male":"女",//后面的逗号必须要写

}

2、声明map:mapName := make(map[type1]type2){}

3、map索引取值,mapName["key"],例如:sexes["Male"]

4、遍历map,可以使用range,例如:

for _,sex := range sexes {

fmt.Println(sex)

}

5、向map中增加元素:mapName["newKey"]=value,例如:sexes["unknow"] = "未知性别"//向map增加元素

6、删除map的元素:delete(mapName,"key"),例如:delete(sexes,"unknow")//删除map中的元素,会删除map中由m[x]建立的实例

7、检查map中是否存在某元素

例如:

var val string

var present bool

val,present = sexes["nothing"]

也可以直接使用“逗号ok”的形式,例如:v,ok := sexes["Male"]

Go语言学习笔记(四) [array、slices、map]

时间: 2024-08-24 09:56:38

Go语言学习笔记(四) [array、slices、map]的相关文章

【GO】GO语言学习笔记四

流程控制 1.条件语句 举个栗子: if x>5 { return 1; }else{ return 0; } 注意: ? 条件语句不需要使用括号将条件包含起来();? 无论语句体内有几条语句,花括号{}都是必须存在的;? 左花括号{必须与if或者else处于同一行;? 在if之后,条件语句之前,可以添加变量初始化语句,使用;间隔;? 在有返回值的函数中,不允许将"最终的"return语句包含在if...else...结构中,否则会编译失败: function ends with

C语言学习笔记(四) 运算符优先级

C语言中有很多运算符,除了四则运算,还有位运算.比较运算.逻辑运算.赋值运算等等,令人眼花缭乱的同时,优先级也让人头疼.通常建议在写代码的时候不用省略括号,但是并不是所有程序员都会按照这个规矩来,因此还是有必要记录一下,以备查阅. 下面表格中详细记录了各种运算符的优先级.没有必要死记硬背这张表,代码见多了用多了就慢慢记得了.总结几个比较重要的原则: 取成员的"0"目运算符[() . -> []]优先级最高: 单目运算符高于双目运算符: 四则运算高于移位运算: 移位运算高于比较运算

初探swift语言的学习笔记四(类对象,函数)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/29606137 转载请注明出处 假设认为文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! swift扩展了非常多功能和属性,有些也比較奇P.仅仅有慢慢学习,通过经验慢慢总结了. 以下将初步学习一下类的写法. 码工,最大爱好就是看码,而不是文字,太枯燥. // // computer.swift // swiftDemo // // C

初探swift语言的学习笔记四-2(对上一节有些遗留进行处理)

在上一节中有些问题还没有弄清,在这里自己写了一下,做了一下验证,并希望能给读者有所帮助. 看例子: 例子中包括 callback函数的声明与使用 函数作为形参进行传递 函数作为返回值 函数支持泛型,当然class也支持. import Foundation typealias Point = (Int, Int) let origin: Point = (0, 0) //初始化函数用 func willDoit(sender : CallBackManager) { println("willD

Go语言学习笔记十三: Map集合

Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. Go语言中Map的写法比Java简单些,比Python繁琐. 定义Map var x map[string]string x : = make(map[string]string) 写法上有些奇怪,map为关键字,右侧中括号内部为key的类型,中括号外部为value的类型.一般情况下使用逗号或者冒号

R语言学习笔记

參考:W.N. Venables, D.M. Smith and the R DCT: Introduction to R -- Notes on R: A Programming Environment for Data Analysis and Graphics,2003. http://bayes.math.montana.edu/Rweb/Rnotes/R.html 前言:关于R 在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data

go语言学习笔记

go语言学习笔记 go语言学习笔记(初级) 最近一直在学习go语言,因此打算学习的时候能够记录 一下笔记.我这个人之前是从来没有记录笔记的习惯, 一直以来都是靠强大的记忆力去把一些要点记住. 读书的时候因为一直都是有一个很安静和很专心的环境, 因此很多事情都能记得很清楚,思考的很透彻.但是随着 年纪不断增加,也算是经历了很多的事情,加上工作有时会让人 特别烦闷,很难把心好好静下来去学习,去思考大自然的终极 奥秘,因此需要记录一些东西,这些东西一方面可以作为一种自我激励 的机制,另一方面,也算是自

JavaScript--基于对象的脚本语言学习笔记(一)

1.两种嵌入js的方式 使用javascript前缀构建url:<a href="javascript:alert('运行JavaScript..')">运行js</a> js脚本放在<style></style>之间: <style type="text/javascript"> alert("运行JavaScript..") </script> 2.如果没有声明变量直接使

Go语言学习笔记(三) [控制结构、内建函数]

日期:2014年7月21日 一.控制结构 1.Go中,只有几个控制结构,它没有do或者while循环,有for,灵活的switch语句和if,在switch中可以接受像for那样可选的初始化语句,另外Go中还提供了类型选择和多路通信转接器的select.Go的控制结构的语法和C相比有所不同,它不需要圆括号,但语句体必须总是包含在大括号内. 2.控制结构语法 1)if-else (1)if后紧跟单个条件 例如:if x > 0 {   //{必须和if在同一行,这是Go语法规定的,如果换行写,编译