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")
 
 
 

【GoLang】GoLang 的流程与函数的更多相关文章

  1. [golang]golang如何覆盖输出console,实现进度条;golang一个骚气的进度提示库

    [golang]golang如何覆盖输出console,实现进度条 package main import( "fmt" "os" "time&quo ...

  2. golang(3):strings和strconv使用 & 时间和日期类型 & 指针类型 & 流程控制 & 函数

    strings和strconv使用 . strings.HasPrefix(s string, prefix string) bool: // 判断字符串s是否以prefix开头 . . string ...

  3. golang内置数据类型作为函数参数

    先上结论 golang的所有内置类型作为函数参数传递都是传值的方式(没有传递引用一说),需要注意的是:数组.slice和map作为函数参数时也是传值,但是如果对结构内元素进行的修改,修改的是原数据.如 ...

  4. golang中字符串内置函数整理

    字符串内置函数 1. 判断字符串的长度 str := "korea国" fmt.Println("str len=", len(str)) 2. 字符串遍历,同 ...

  5. golang拾遗:内置函数len的小知识

    len是很常用的内置函数,可以测量字符串.slice.array.channel以及map的长度/元素个数. 不过你真的了解len吗?也许还有一些你不知道的小知识. 我们来看一道GO101的题目,这题 ...

  6. 仙人指路,引而不发,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中New和Make函数的使用背景和区别EP16

    Golang只有二十五个系统保留关键字,二十几个系统内置函数,加起来只有五十个左右需要记住的关键字,纵观编程宇宙,无人能出其右.其中还有一些保留关键字属于"锦上添花",什么叫锦上添 ...

  7. golang字符串常用的系统函数

    1.统计字符串的长度,按字节len(str) str := "hello北京" fmt.Println("str len=", len(str)) 2.字符串遍 ...

  8. [Go] golang结构体成员与函数类型

    package main import ( "fmt" ) //定义一个类型 type tsh struct { //定义成员,类型是func() string test func ...

  9. Golang利用select和普通函数分别实现斐波那契数列

    //斐波那契数列 //1 1 2 3 5 8 //观察规律 //第一轮:前两个数是1,1,相加等于2 //第二轮:第二个数和第三个数是1,2,相加等于3 //第三轮:第三个数和第四个数是2,3,相加等 ...

随机推荐

  1. asp.net 中的app_offline.htm的使用

    前段时间,系统升级,由于系统更新发布时间较长,所以必须停掉站点进行更新.导致很多用户都来反馈系统无法访问,还认为站点被黑掉了. 所以经过那件事我们也在思考,如何做到不停机,进行热部署.单机环境下(双机 ...

  2. MAC 系统下使用 Sublime Text 2 直接编译运行 java 代码

    本文参考了网上很多文章,就不一一列出了. sublime的版本是 sublime test 2 jdk版本 jdk1.7 1. mac下貌似直接就可以运行javac 和 java命令的,如果不能直接运 ...

  3. WebAPI文件上传与下载

    http://www.cnblogs.com/GarsonZhang/p/5511427.html https://github.com/GarsonZhang/FileUpLoadAPI

  4. osharp3引入事务后操作结果类别的调整

    /// <summary> /// 表示业务操作结果的枚举, /// 对于业务务操作单元的影响只有二种状态, /// 成功,无变化: 操作将继续,事务将继续 /// 失败:将导致 操作被中 ...

  5. html页面 代码 编写的 一些 基本素养 约定 知识点

    hmtl代码书写也要养成一段一段的 区块代码, 每个区块代码 进行 html的 功能注释 自由文字的获得: (lorem ipsum: 乱数假文, 哑元文字) lorem ipsum: lipsum等 ...

  6. linux的bash 终端操作快捷键

    bash中的快捷键操作: 分为两大类, 一是移动, 另一个是删除 一. 移动 1. 按字符移动: ctrl+f, ctrl+b 3. 按行移动: ctrl+a, ctrl+e 二. 删除: 1. 按字 ...

  7. CF467 AB 水题

    Codeforces Round #267 (Div. 2) (C和D的题解单独写:CF467C George and Job (DP) CF467D Fedor and Essay 建图DFS) C ...

  8. log4net--不可多得的开源日志记录组件

    log4net--不可多得的开源日志记录组件 1 前奏 一直在用log4net日志工具,却没时间写个日志给大家分享一下这个工具,趁最近比较空些,好好分享一下这个工具. 2 说明 Log4net介绍就不 ...

  9. ASP.NET 大文件下载的实现思路及代码

    文件下载是一个网站最基本的功能,ASP.NET网站的文件下载功能实现也很简单,但是如果遇到大文件的下载而不做特殊处理的话,那将会出现不可预料的后果.本文就基于ASP.NET提供大文件下载的实现思路及代 ...

  10. HTTP状态301、404、200、304分别表示什么意思

    301 (永久移动)请求的网页已永久移动到新位置.服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置.您应使用此代码告诉 Googlebot 某个网页或网站已永久移动 ...