003.GO流程与函数
1 概述
1.1 Go中流程控制分三大类:条件判断,循环控制和无条件跳转
2 流程
2.1 if
2.1.1 if条件判断语句中不需要括号
2.1.2 条件判断语句里面允许声明一个变量,这个变量的作用域只能在该条件逻辑块内
2.1.3 多个条件使用 else if, 与C语言语法一样
2.2 goto
2.2.1 用goto跳转到必须在当前函数内定义的标签, 一般不建议使用
2.3 for
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 switch
2.4.1 有些时候你需要写很多的if-else来实现一些逻辑处理,这个时候代码看上去就很丑很冗长, 而且也不易于以后的维护,这个时候switch就能很好的解决这个问题
2.4.2 Go里面switch默认相当于每个case最后带有break
2.4.3 可以使用fallthrough强制执行后面的case代码
3 函数
3.1 定义标准形式
3.1.1 func funcName(input1 type1, input2 type2) (output1 type1, output2 type2) { //这里是处理逻辑代码 //返回多个值 return value1, value2 }
3.2 官方建议:最好命名返回值,否则会造成生成的文档可读性差
3.3 如果命名返回值, 则可以直接写成return
3.4 变参
3.4.1 func argsSum(args ...int64) (sum int64) { for _, v := range args { sum += v } return }
3.4.1.1
3.5 值传递&引用传递
3.5.1 当我们传一个参数值到被调用函数里面时,实际上是传了这个值的一份copy, 当在被调用函数中修改参数值的时候,调用函数中相应实参不会发生任何变化, 因为数值变化只作用在copy上
3.5.2 我们需要将x所在地址&x传入函数,并将函数的参数的类型由int改为*int,即改为指针类型, 才能在函数中修改x变量的值。此时参数仍然是按copy传递的,只是copy的是一个指针
3.6 defer
3.6.1 当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回
3.6.2 相当于Java的finally
3.7 函数作为值&类型
3.7.1 函数也是一种变量,我们可以通过type来定义它
3.7.2 它的类型就是所有拥有相同的参数,相同的返回值的一种类型
3.7.3 既是函数模板的角色,也可以作为值传递,如函数实参
3.8 defer/panic/recover
3.8.1 go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理
3.8.2 panic之后的代码均不会执行
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.8.6 注意
3.8.6.1
3.9 error
3.9.1 error也是value
3.9.2 error与异常处理的最佳实践参考官方博客或者其他github项目
3.9.3 官方推荐方式
3.9.3.1 总是检查error,并处理error
3.9.3.2 代码示例
3.9.3.2.1 https://github.com/golang/go/blob/master/src/net/http/client.go
3.9.4 异常处理方式
3.9.4.1 参考博客
3.9.4.1.1 http://reusee.github.io/post/error-handling/
3.9.4.2 代码示例
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 main&init
3.10.1 Go程序会自动调用init()和main()
3.10.2 每个package中的init函数都是可选的,但package main就必须包含一个main函数
3.10.3 执行过程
3.10.3.1
3.11 import
3.11.1 导入的是文件夹名称,然后自动扫面package,引用的时候使用package
3.11.2 别名
3.11.2.1 import( f "fmt")
 
 
 

最新文章

  1. MATLAB cvx 工具包使用
  2. Java enum的用法详解
  3. Rational Software Architect V8.5.1安装
  4. 【转】Android WebView 播放视频总结
  5. jquery属性选择器中|value和^value的区别
  6. 【M17】考虑使用缓式评估
  7. Codeforces Round #274 (Div. 1) B. Long Jumps 数学
  8. PHP 开启报错机制
  9. ios sourecTree
  10. PHP函数register_shutdown_function的用法
  11. scrapy 选择器官方文档
  12. Win10开机“提示语音”以及”随机播放音乐”
  13. 打开MCMC(马尔科夫蒙特卡洛)的黑盒子 - Pymc贝叶斯推理底层实现原理初探
  14. day7_子类的拷贝构造与拷贝赋值
  15. Python 有道翻译 爬虫 有道翻译API 突破有道翻译反爬虫机制
  16. UVA12265-Selling Land(单调栈)
  17. Linux时区详解
  18. 如何将本地代码通过git上传到码云
  19. re模块逐步进阶
  20. mongoDb CPU利用率100%的分析和解决

热门文章

  1. RHEL本地yum源
  2. oss cmd
  3. GoLang之协程
  4. Python之路【第十六篇续】Django进阶篇
  5. python内置函数每个执行一次
  6. 浅谈T-SQL中的特殊联结
  7. centos 安装 mysql5.6
  8. 2015年12月10日 spring初级知识讲解(二)最小化Spring XML配置 注解
  9. PHP基础 mysqli的事务处理
  10. POJ 3252 Round Numbers