第四篇,我都没想到我居然有毅力写到第四篇…..go学习笔记(4) — iota , array ,slice , map
关键字
IOTA
Go 的一个关键字,可以在声明enum的时候用,开始时默认值为0,const 中每增加一行 +1
1 | const( |
常量声明省略值时,默认和之前的值相同,即 z 隐式地声明为 iota , 所以 y 其实也可以省略。
1 | const( |
当iota遇到下一个const, 会自动重置。
1 | const ( |
iota 在同一行值相同。
1 | const( |
看到这里可以总结了,在同一const中,iota 随行数逐增。
Array
array 即是数组,php程序员曾经的噩梦 ,定义方式如下
1 | var arr [n]type |
n 代表 数组长度,type 代表存储元素的类型。
Typora 今天出的bug有点多,晚点再找找有什么好的markdown编辑器。搜了一下,v友出的 vnote ,可惜不能所见即所得,但是感觉还不错。大纲什么的功能让人觉得这玩意挺像IDE的。也可以使用hexo-admin来在线编辑。
1 | var arr[10]int |
当把数组作为参数传入函数时,我们其实传入的只是该数组的一副本,如果要进行操作,就需要用到 * 指针了。
数组可以使用 := 来声明
1 | a:=[3]int{1,2,3} |
如果想声明多维数组的话
1 | mutiarray := [2][4]int{{1,2,3,4},{1,2,3}} |
上面示例中,省略了内部类型的定义,以及如果索引值没有的话,和一维数组同样处理。
slice
很多时候,数组不能满足我们的需求,当我们不知道需要定义多大的数组时,我们就需要”动态数组” ,该类型为 slice 。
slice 并不是真正意义上的动态数组,而是一个引用类型。 slice 指向一个底层的 array , 所以slice的声明于 array 一样,只是不需要长度。
1 | var a []int |
在 [x:y] 中 , x 代表开始的位置,y 代表结束的位置,x的默认值为0,y的默认值为len(array[])
对slice 有几个实用的内置函数
len(slice())获取长度cap(slice())获取容量append(slice(),slice1())对slice追加元素,并返回slicecopy(slice()),复制,并返回复制元素的个数。
还有一个用法是
1 | slice = array[2:4:7] |
容量为7-2=5 , 产生的slice无法访问最后三个元素。
map
即python字典的概念,格式为 1
2
3
4
5
6
7
```go
var numbers map[string]int
//也可以这么声明
numbers := make(map[string]int)
numbers['one'] = 1 //赋值
使用map的过程中,我们需要注意到,map是无序的,需要通过key来获取,不然的话每次便利的结果都会不一样。map的长度不固定的,与slice一样,都是引用类型。
len() 函数适用于map,返回的是map所拥有key的数量。
需要注意的是,map 作为基本类型来说并非是进程安全(thread-safe)的,在多go-routine 存取时,必须使用mutex lock 。
1 | delete(numbers,"one") //删除key为"one"的元素 |
make new
make用于内建类型的内存分配,new用于各种类型的内存分配。new返回的是指针,make返回的是初始化后的(非零)值。make只能用于创建slice 、map、channel,并填充适当的非空值。
零值
1 | int 0 |
为啥这次字能这么多?因为是边读 《go web编程》一边做的笔记