Go之hello world

看了下目录, 似乎go是对让C对程序员更友好, 如应对垃圾回收, 多返回值. 像C又像Java

Chapter 1: 简介

rune
复数
错误类型

Go没有逗号表达式, 如果想在for中执行多个变量,应当使用平行赋值.

Reverse a
1
2
3
for i,j := 0,len(a)-1; i<j; i,j = i+1,j-1 {
a[i], a[j] = a[j], a[i] // 平行赋值
}

range

switch

switch, fallthrough(是break的反面, 这样就无需break了
同时case之间是逐个尝试的, case可以使用逗号分隔列表)

数组

a := […]int{1, 2, 3}, Go会自动统计元素的个数.
将一个数组赋值给另一个数组, 会复制所有的元素.
尤其是当向函数内传递一个数组的时候, 它会获得一个数组的副本, 而不是数组的指针

slice是引用类型, 对应vector

引用类型使用make创建
变参是slice类型
赋值只是指针赋值, 对值赋值应该用copy?

chapter 2 函数

defer

延迟代码, 注意defers的LIFO特点

一个复杂声(定)明(义)

1
2
3
4
5
var xs = map[int]func() int {
1: func() int { return 10 },
2: func() int { return 20 },
3: func() int { return 30 }, /* 此处必须要有逗号 */
}

大杀器: panic/recover

Panic
是一个内建函数, 可以中断原有的控制流程, 进入一个令人恐慌的流程中
当函数F调用panic, F的执行被中断, 接着执行F中的延迟函数, 然后F返回到调用它的地方
在调用的地方,F的行为就像调用了panic. 这一过程继续向上, 直到程序崩溃时的所有goroutine返回
恐慌可以直接调用panic产生, 也可以由运行时错误产生, 例如访问越界的数组
Recover
是一个内建的函数, 让进入令人恐慌的流程中的goroutine恢复过来
recover仅在延迟函数中有效, 在正常的执行过程中, 调用recover会返回nil并且没有其他任何效果
如果当前的goroutine陷入恐慌, 调用recover可以捕获到panic的输入值, 并且恢复正常的执行

chapter 3 包

文件名不需要与包名一致; Go包可以由多个文件组成, 但是使用相同的package < name>
通过在导入语句指定其他名称来覆盖默认名称
包名是小写的一个单词; 不应当有下划线或混合大小写

public/private

名称以大写字母起始的函数是可导出的, 可以在包的外部调用

test

一边写代码一边写测试

chapter 4 进阶

go有指针, 但是没有对指针的运算, 降低复杂度
那内存的管理, 网络包的解析, 需用偏移地址怎么办呢?