第四篇,我都没想到我居然有毅力写到第四篇…..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编程》一边做的笔记