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. Tomcat 系统架构与设计模式

    Tomcat 系统架构与设计模式,第 1 部分: 工作原理 这个分为两个部分的系列文章将研究 Apache Tomcat 的系统架构以及其运用的很多经典设计模式.本文是第 1 部分,将主要从 Tomc ...

  2. thinkphp 3.2响应头 x-powered-by 修改

    起初是看到千图网的登录链接 查看到的 自己做的网站也看了下 修改的办法就是TP3.2.2 的框架里 具体路径是D:\www\ThinkPHP\Library\Think\View.class.php ...

  3. Yii2 事务

    $transaction = $connection->beginTransaction(); try { // ... executing other SQL statements ... $ ...

  4. WinForm使用皮肤图文步骤

    Winfrom本身样式提供的是Windows经典样式.. 不说多丑也绝称不上好看..有时为了用户体验就不得不需要想办法弄漂亮一点..皮肤包会是一个不错的选择.. 不废话了..开整.. 首先从网上下载免 ...

  5. mysql分表的3种方法(转)

    一,先说一下为什么要分表 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. 根据个人经验,mysq ...

  6. 【9-6】Centos学习笔记

    linux文件系统结构 常用技巧 快捷键启动终端 su命令,使用超级用户登陆 visudo :编辑用户权限 tar xf 文件名:解压文件 Vim编辑器 Tips yum包管理:Yum(全称为 Yel ...

  7. mysql explain详解

    对于经常使用mysql的兄弟们,对explain一定不会陌生.当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联合和以什么次序的信息.借助于 ...

  8. 关于shell脚本时遇value too great for base (error token is "08")

    今天在书写一个定时cp脚本时遇到了一个问题,value too great for base (error token is "08") 在网上查看到原来是以0开头的数字 系统会默 ...

  9. golang笔记——包

    1.包简述 GO本身没有项目的概念,只有包,包括可执行包和不可执行包,而不管什么包,都应该包含在 $GOPATH/src 目录下,GO命令和编译器会在 $GOPATH/src 目录下搜索相应的包.比如 ...

  10. 阿里云Centos配置iptables防火墙

    虽说阿里云推出了云盾服务,但是自己再加一层防火墙总归是更安全些,下面是我在阿里云vps上配置防火墙的过程,目前只配置INPUT.OUTPUT和FORWORD都是ACCEPT的规则 一.检查iptabl ...