go学习笔记(4) — iota , array ,slice , map

第四篇,我都没想到我居然有毅力写到第四篇…..go学习笔记(4) — iota , array ,slice , map

关键字

IOTA

Go 的一个关键字,可以在声明enum的时候用,开始时默认值为0,const 中每增加一行 +1

1
2
3
4
5
const(
x = iota //x=0
y = iota //y=1
z //z=2
)

常量声明省略值时,默认和之前的值相同,即 z 隐式地声明为 iota , 所以 y 其实也可以省略。

1
2
3
4
5
6
7
const(
x = iota //x=0
y = iota //y=1
z //z=2
)

const v = iota //v = 0

iota遇到下一个const, 会自动重置。

1
2
3
const (
h,i,j = iota , iota, iota //h=0,i=0,j=0
)

iota 在同一行值相同。

1
2
3
4
5
const(
a = iota // a=0
b = "B"
c = iota // c=2
)

看到这里可以总结了,在同一const中,iota 随行数逐增。

Array

array 即是数组,php程序员曾经的噩梦 ,定义方式如下

1
var arr [n]type

n 代表 数组长度,type 代表存储元素的类型。

Typora 今天出的bug有点多,晚点再找找有什么好的markdown编辑器。搜了一下,v友出的 vnote ,可惜不能所见即所得,但是感觉还不错。大纲什么的功能让人觉得这玩意挺像IDE的。也可以使用hexo-admin来在线编辑。

1
2
3
4
var arr[10]int
arr[0] = 42
arr[1] = 13
arr[9] // 没有赋值时引用默认为 0 , 其他类型为nil

当把数组作为参数传入函数时,我们其实传入的只是该数组的一副本,如果要进行操作,就需要用到 * 指针了。

数组可以使用 := 来声明

1
2
3
a:=[3]int{1,2,3}
b:=[5]int{1,2,3} // 未赋值的索引值默认为0
c:=[...]int{1,2,3} //... go将根据有多少个值计算长度

如果想声明多维数组的话

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

上面示例中,省略了内部类型的定义,以及如果索引值没有的话,和一维数组同样处理。

slice

很多时候,数组不能满足我们的需求,当我们不知道需要定义多大的数组时,我们就需要”动态数组” ,该类型为 slice 。

slice 并不是真正意义上的动态数组,而是一个引用类型。 slice 指向一个底层的 array , 所以slice的声明于 array 一样,只是不需要长度。

1
2
3
4
5
6
7
var a []int

//声明一个数组
var ar = [10]byte{'1','2','3','4','5'}

// a 指向ar现有的元素,ar[1],ar[2],ar[3]
a = ar[2:4]

[x:y] 中 , x 代表开始的位置,y 代表结束的位置,x的默认值为0,y的默认值为len(array[])

slice 有几个实用的内置函数

  • len(slice()) 获取长度
  • cap(slice()) 获取容量
  • append(slice(),slice1()) 对slice追加元素,并返回slice
  • copy(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只能用于创建slicemapchannel,并填充适当的非空值。

零值

1
2
3
4
5
6
7
8
9
10
11
int		0
int8 0
int32 0
int64 0
uint 0x0
rune 0
byte 0x0
float32 0
float64 0
bool false
string ""

为啥这次字能这么多?因为是边读 《go web编程》一边做的笔记