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. NestIn VS插件 visual studio 中将同类CS文件放在一起显示

    https://visualstudiogallery.msdn.microsoft.com/9d6ef0ce-2bef-4a82-9a84-7718caa5bb45 Nest files in So ...

  2. ASP.NET技巧:教你制做Web实时进度条

    网上已经有很多Web进度条的例子,但是很多都是估算时间,不能正真反应任务的真实进度.我自己结合多线程和ShowModalDialog制做了 一个实时进度条,原理很简单:使用线程开始长时间的任务,定义一 ...

  3. Mysql 排名查询

    原文地址: http://www.cnblogs.com/songshuai/p/5688550.html http://blog.csdn.net/u010503822/article/detail ...

  4. python递归理解图

    递归:下一级只能return给自己的上一级. import re val="9-2*5/3+7/3*99/4*2998+10*568/14" val="9-2*5/3+7 ...

  5. android控件库(1)-带删除功能的EditText

    DJEditText.java /** * Created by xp.chen on 2016/11/25. */ public class DJEditText extends AppCompat ...

  6. 推荐近期15个 Node.js 开发工具

    近来Node.js 越来月流行了,这个基于Google V8 引擎建立的平台, 用于方便地搭建响应速度快.易于扩展的网络应用.在本文中,我们列出了2015年最佳的15个 Node.js 开发工具.这些 ...

  7. 那些你不知道的chrome URLs

    Xee:我用的是七星浏览器,因为我看了很多的浏览器,它们的版本都停滞不前了: 360安全浏览器的重度用户肯定不会对 se:last (上次未关闭页面)这个页面感到陌生,即使您没有见过这个,但也一定很熟 ...

  8. linux配置java环境变量

    linux配置java环境变量(详细) 一. 解压安装jdk 在shell终端下进入jdk-6u14-linux-i586.bin文件所在目录, 执行命令 ./jdk-6u14-linux-i586. ...

  9. 【bzoj1596】[Usaco2008 Jan]电话网络

    题目描述 Farmer John决定为他的所有奶牛都配备手机,以此鼓励她们互相交流.不过,为此FJ必须在奶牛们居住的N(1 <= N <= 10,000)块草地中选一些建上无线电通讯塔,来 ...

  10. Python 集合set添加删除、交集、并集、集合操作符号

    在Python中集合set是基本数据类型的一种,它有可变集合(set)和不可变集合(frozenset)两种.创建集合set.集合set添加.集合删除.交集.并集.差集的操作都是非常实用的方法. 1. ...