1. “{”不能单独放在一行
2. 同一个文件夹下的文件只能有一个包名,否则编译报错
3. 一个语句不需要以 ';' 结尾,但如果想把多个语句写在同一行,就需要以“;” 结尾
4. 字符串连接用 “+”
5. 使用 := 赋值操作符,只能被用在函数体内,而不可以用于全局变量的声明与赋值
6. 如果你想要交换两个变量的值,则可以简单地使用 a, b = b, a,两个变量的类型必须是相同。
7. 声明的变量必须被使用,但有时不需要使用从一个函数得到的某个返回值。 可以使用空白标识符 “_”,来抛弃值。
8. iota是一个自增枚举,而且还可以在枚举式里运算
9. select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运
10. len() 函数可以接受不同类型参数并返回该类型的长度
11. init函数不能被其他函数调用,而是在main函数执行之前,自动被调用
12. 全局变量是允许声明但不使用的
13. unsafe.Sizeof返回的是数据类型的大小
14. 枚举 iota用法:
(1) 在 const关键字出现时将被重置为 0
(2) 每新增一行,将使 iota 计数一次(值加1)
(3) 某行赋值其他值时, 下面的每行都会取同样的值。而且iota同样在计数。
(4) 再次赋值 = iota时,会重新获得 iota计数的值
15. switch 后的变量可以是任何数据类型,但各个case 后的数据类型必须相同。
16. switch 可以被用于 type-switch 来判断某个 interface 变量中实际存储的变量类型
var x interface{}
switch i := x.(type) {
case int:
fmt.Printf("x 是 int 型")
case float64:
fmt.Printf("x 是 float64 型")
} }
17. (1) 数组的声明:var balance [5]int
(2) 数组的初始化: var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
(3) 如果数组长度不确定,可以使用 ... 代替: var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
(4) 可以通过指定下标来初始化元素:balance := [5]float32{1: 20, 2:40}
(5) 二维数组的声明:var balance [5][5]int
(6) 初始化二维数组:var balance [2][3]int = {{1,2,3},{4,5,6}} //注意最右边的是第一维,左边的是第二维
(7) 也可以创建一个空的二维数组,然后用append的方式,把一维数组添加进二维数组 datas = append(datas, row1)
18. 打印变量的内存地址: fmt.Printf("变量的地址: %x\n", &a ) 注意用的是 %x,十六进制
19. (1) 创建切片: myslice := make([]int, 4, 10) //4是初始化大小,10是最大容量(可省略)
(2) 切片添加多个元素: myslice = append(myslice, 4,5,6)
(3) 复制切片: copy(myslice2, myslice)
20. 语言范围(Range):在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对
nums := []int{2, 3, 4}
for index,value := range nums {}
kvs := map[string]string{"a": "apple", "b": "banana"}
for key,value := range kvs {}
21. (1) 创建map: mCapitalMap := make(map[string]string)
(2) 删除元素: delete(mCapitalMap, "keyA")
(3) map是无序的,遍历时要注意,可以另建有序key数组
22. 提供了interface数据类型,相当于 C++ 的虚基类
23. go并发:通过 go 关键字开启 goroutine,goroutine 是轻量级线程,注意是线程。
go func(x, y, z)
24. 通道 channel 用于多线程同步
(1) 创建:ch := make(chan int)
输入值:ch <- value
输出值: value <- ch
(2) 可以设置缓冲区,通过 make 的第二个参数指定大小: ch := make(chan int, 100)
(3) 如果不带缓冲,发送方会阻塞, 直到接收方接收了值
(4) 如果带缓冲,发送方的值拷贝到缓冲区内,如果缓冲区已满,发送方会阻塞,直至接收方接收了新的值。
25. 数组和切片的区别
(1) 数组在创建时,需指定最大存放的元素个数;切片不用。
(2) 切片可以中途用append插入数据,以及自动扩容,但数组不行。
(3) 切片需要用make来创建
(4) 数组是值拷贝, 切片是引用