1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| ### 1. := = ==
:= 给某变量的第一次赋值,初始化
= 变量的非第一次赋值
== 等于操作符
### 2. go中nil的使用
指针、切片、映射、通道、函数和接口的零值则是 nil。
- nil 标识符是不能比较的 - nil 不是关键字或保留字 - nil 没有默认类型 - 不同类型 nil 的指针是一样的 - 不同类型的 nil 是不能比较的 - 两个相同类型的 nil 值也可能无法比较 - nil 是 map、slice、pointer、channel、func、interface 的零值 - 不同类型的 nil 值占用的内存大小可能是不一样的
### 3.切片 slice
类似于py或Java的list ,是数组的抽象,支持数组扩容 定义: slice1 := make([]type, len)
len 获取长度 cap 获取容量 append(slice1 ,v1,...) copy(new_slice,slice1)
### 4.集合 map
map 无序k-v ,快速根据k 找到v,类似于索引,在做循环打印的时候,无法固定返回顺序,因为map 用hash表来实现的
- 声明变量,默认 map 是 nil var map_val map[key_data_type]value_data_type
- 使用 make 函数 map_val := make(map[key_data_type]value_data_type)
### 并发 goroutine go sync() ### 通道 channel 既然已经有了线程的概念,那么就会存在线程间的同步和通讯问题,Go 使用通道(channel)来实现。
通道可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。使用操作符 <-,符号左边是接收者,右边是发送者。
使用 make 创建 channel,如下:
``` ch := make(chan int, 100) // make 第二个参数 100 是该通道的缓冲区,是一个可选参数,如果不指定,那么就是无缓冲的通道 ch <- v // 把 v 发送到通道 ch v := <-ch // 从 ch 接收数据 // 并把值赋给 v ``` 通道与消息队列是等效的,如果通道缓冲区满,那么再往通道里塞数据,就会阻塞该 goroutine;同样,如果通道缓冲区没有数据了,再次接收通道数据,也会阻塞该 goroutine。
|