
1.1 Go中流程控制分三大类:条件判断,循环控制和无条件跳转
2.1.2 条件判断语句里面容许声明一个变量,这个变量的做用域只能在该条件逻辑块内
2.1.3 多个条件使用 else if, 与C语言语法同样
2.2.1 用goto跳转到必须在当前函数内定义的标签, 通常不建议使用
2.3.1 Go里面最强大的一个控制逻辑就是for, 它便可以用来循环读取数据,又能够看成while来控制逻辑,还能迭代操做
2.3.2 for expression1; expression2; expression3
2.3.3 有些时候须要进行多个赋值操做,因为Go里面没有,操做符,那么可使用平行赋值i, j = i+1, j-1
2.3.4 expression1和expression3能够忽略, 其中;也能够省略,那么就变成while的功能了
2.3.5 break操做是跳出当前循环,continue是跳过本次循环
2.3.6 for配合range能够用于读取slice和map的数据
2.3.6.1 可使用_变量来接收并丢弃不须要的返回值
2.4.1 有些时候你须要写不少的if-else来实现一些逻辑处理,这个时候代码看上去就很丑很冗长, 并且也不易于之后的维护,这个时候switch就能很好的解决这个问题
2.4.2 Go里面switch默认至关于每一个case最后带有break
2.4.3 可使用fallthrough强制执行后面的case代码
3.1.1 func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) { //这里是处理逻辑代码 //返回多个值 return value1, value2 }
3.2 官方建议:最好命名返回值,不然会形成生成的文档可读性差
3.3 若是命名返回值, 则能够直接写成return
3.4.1 func argsSum(args ...int64) (sum int64) { for _, v := range args { sum += v } return }
3.5.1 当咱们传一个参数值到被调用函数里面时,其实是传了这个值的一份copy, 当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化, 由于数值变化只做用在copy上
3.5.2 咱们须要将x所在地址&x传入函数,并将函数的参数的类型由int改成*int,即改成指针类型, 才能在函数中修改x变量的值。此时参数仍然是按copy传递的,只是copy的是一个指针
3.6.1 当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回
3.7.1 函数也是一种变量,咱们能够经过type来定义它
3.7.2 它的类型就是全部拥有相同的参数,相同的返回值的一种类型
3.7.3 既是函数模板的角色,也能够做为值传递,如函数实参
3.8.1 go中能够抛出一个panic的异常,而后在defer中经过recover捕获这个异常,而后正常处理
3.8.3 若是不用recover捕获panic异常,会致使整个进程出错中断
3.8.4 go省略了try, panic至关于trow抛出异常, recover至关于catch捕获异常, 可是go限制只能在defer即finally中捕获异常 并且go的defer是动态向上反向队列方式传递的, 即finally链式反向执行
3.8.5 panic抛出异常, 中止当前执行点, 一直往上层抛出异常, 直到程序crash, 或者被defer捕获阻止崩溃,而后继续下一个defer
3.9.2 error与异常处理的最佳实践参考官方博客或者其余github项目
3.9.3.1 老是检查error,并处理error
3.9.3.2.1 https://github.com/golang/go/blob/master/src/net/http/client.go
3.9.4.1.1 http://reusee.github.io/post/error-handling/
3.9.4.2.1 https://github.com/reusee/codes/blob/master/err/err.go
3.9.4.2.2 https://github.com/golang/go/blob/master/src/encoding/gob/error.go
3.10.1 Go程序会自动调用init()和main()
3.10.2 每一个package中的init函数都是可选的,但package main就必须包含一个main函数
3.11.1 导入的是文件夹名称,而后自动扫面package,引用的时候使用package
3.11.2.1 import( f "fmt")