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. Linux下小工具使用总结

    0. 前言 这篇博客仅用于记录个人在工作中用到的一个小工具,后续用到别的会再补充. 1. Tmux 终端分用器(multiplexer),可以在一个屏幕上创建多个终端,这个工具也可以用于结对编程. 个 ...

  2. isArray polyfill

    Array.isArray在ie9+浏览器上已经支持,可以放心使用.在垃圾浏览器上,可以说使用如下polyfill(出自MDN) if(!Array.isArray){ Array.isArray = ...

  3. .NET对象判等归纳与总结

    1.引言 最近在看<CLR via C#>看到对象判等的那一节,觉得这也是.NET基础知识中比较重要的部分就写一篇博文来简单的总结归纳一下. 2..NET下的对象判等 在.NET中关于对象 ...

  4. PHP使用数据库的并发问题(转)

    在并行系统中并发问题永远不可忽视.尽管PHP语言原生没有提供多线程机制,那并不意味着所有的操作都是线程安全的.尤其是在操作诸如订单.支付等业务系统中,更需要注意操作数据库的并发问题. 接下来我通过一个 ...

  5. idea配置2个tomcat

    复制tomcat   分别放在不同地方

  6. jQuery 遍历 - find() 方法

    实例 搜索所有段落中的后代 span 元素,并将其颜色设置为红色: $("p").find("span").css('color','red'); 详情:htt ...

  7. nginx禁止ip直接访问

    编辑一个noIp.conf放到虚拟目录中 server { listen default; server_name _; rewrite ^ http://www.xxxx.com/; } 其中 ww ...

  8. linux shell中判断bash脚本输入的参数个数

    看下面的一段程序. #!/bin/bash ]; then echo "参数个数为$#个" else echo "没有参数" fi

  9. 使用MVVM框架(avalonJS)进行快速开发

    背景 在运营活动开发中,因为工作的重复性很大,同时往往开发时间短,某些情况下也会非常紧急,导致了活动开发时间被大大压缩,同时有些活动逻辑复杂,数据或者状态变更都需要手动渲染,容易出错,正是因为这些问题 ...

  10. Redhat系统网络配置

    1.RedHat系统的网络配置文件/etc/sysconfig/network-scirpts/ifcfg-<interface-name>文件 DEVICE=eth0           ...