Golang 流程控制+函数+错误处理机制

流程控制

分支流程控制

  • 单分支

    if 条件表达式 { // { } 必须要有,且左大括号不能换行
        //
    }
    
  • 双分支

    if 条件表达式 { // { } 必须要有,且左大括号不能换行
        
    } else {      // { } 必须要有,且左大括号不能换行,else必须和右大括号同行
         
    }
    
  • 多分支

    if 条件1 {          // { } 必须要有,且左大括号不能换行
        
    } else if 条件2 {   // { } 必须要有,且左大括号不能换行,else必须和右大括号同行
        
    } else if 条件n {   // { } 必须要有,且左大括号不能换行,else必须和右大括号同行
        
    } else {           // { } 必须要有,且左大括号不能换行,else必须和右大括号同行
                             // 多分支中 else 不是必须的
    }
    
  • if 语句可以初始化变量

    if ok := function(); ok {
        
    }
    
  • switch语句

    switch 表达式 {
        case 表达式1,表达式2,...:
          语句1
        case 表达式3:
        	语句2
        default:
        	语句3
    }
    
    
    // case的表达式要求不能重复,case表达式值与switch表示值需要是同一类型
    // case后面可以跟多个表达式,用逗号分隔
    // 一旦匹配,就不再进行下一步匹配
    // default不是必须的,可有可无
    // 如果匹配不到,则执行default块(如果有)
    // 匹配选项后面不用加 break,默认不贯穿
    // 如果想要穿透,则用 fallthrough 声明
    // switch后也可以不跟表达式,效果等同 switch True {}
    // switch后可以先声明一个变量再使用 switch i:=100 {}
    
  • if-else if-else 与 switch 使用场景对比

    // 对于匹配区间
    推荐用 if-else if-else
    // 对于匹配具体值
    推荐用 switch
    

循环分支流程控制

  • Go中只有 for 没有 while 也没有 do-while

  • for 使用方法-1 普通 for 循环

    for 循环变量初始化; 循环条件; 循环条件迭代 {
        // 循环操作语句
    }
    
  • for 使用方法-2 模拟 while 循环

    for 循环条件 {
        // 循环操作语句
    }
    
  • for 使用方法-3 死循环

    for {
        // 死循环
    }
    
    // 等价于
    for ;; {
        // 死循环
    }
    
  • for 使用方法-4 for-range

    for index,val := range str {
        fmt.Println(index, val)
    }
    
  • for使用方法-5 新形式

    for 初始化; 循环条件 {
        // 循环操作语句
    }
    
  • for 注意事项

    • 循环条件返回的 bool 的表达式

    • break 可以根据标签跳出

      break         //跳出最近的一层
      break label1  //跳到label1指定位置
      break label2  //跳到label2指定位置
      
      for i := 0; i < 4; i++ {
          label1:
          for j :=0; j < 10; j++ {
              if j == 2 {
                  break label1
              }
              fmt.Println("j =", )
          } 
      }
      
    • continue 可以根据标签跳出

      continue         //跳出最近的一层
      continuecontinue label1  //跳到label1指定位置
      break label2  //跳到label2指定位置
      
      for i := 0; i < 4; i++ {
          label1:
          for j :=0; j < 10; j++ {
              if j == 2 {
                  continue label1
              }
              fmt.Println("j =", )
          } 
      }
      

goto语句

  • 不推荐使用 goto 语句

  • 语法

    label: 语句
    
    goto label
    

函数

定义函数

func 函数名 (形参列表) (返回值列表) { // 左大括号不能换行
    //执行语句
    return xxx
}

函数参数简化

func test(a int, b int, c int) {}
等价于
func test(a,b,c int) {}

函数返回值

  • Go语言可以返回多个值,如果返回不想接收,可以用 _ 来省略

  • 如果只返回一个值,则返回值列表可以不加()

  • 不指定返回值名称

    func add(a int, b int) int {
        result = a + b
        return result
    }  
    
  • 指定返回值名称

    func add(a int, b int) (result int) {
        result = a + b
        return
    }
    

可变参数

  • 会把不定参数封装为一个slice
  • 如果一个函数的形参列表中有可变参数,则可变参数需要放在形参列表最后
func sum (args... int) total int {
    for _, val := range args {
        total += val
    }
    return
}

sum(1,2,3,4,5,6,7)

函数注意事项

  • 基本数据类型和数组默认是值传递的,即进行值拷贝,在函数内部修改,不会影响到原来的值

  • 如果希望函数内部修改可以影响到外面,则需要使用指针

  • Go函数不支持函数重载,不支持嵌套,不支持默认参数

  • Go函数本身也是一种数据类型,可以将函数作为参数传递

    func getSum(n1 int,n2 int) int {
        return n1 + n2
    }
    
    func myFunc(funvar func(int,int) int, num int, num2 int) int {
        return funvar(num1, num2)
    }
    
  • 为函数类型起别名

    type myf func(int,int) int
    

init函数

  • 名字固定,每一个Go源文件中都可以包含这样的一个函数,该函数在main函数执行前,会先被调用

  • 该函数可以用作初始化操作

    func init() { // 无形参,无返回值
        
    }
    
  • 如果有全局变量定义,则执行顺序为

    全局变量定义 -> init函数 -> main函数
    

匿名函数

  • 只调用一次的匿名函数

    res := func (n1 int, n2 int) int {
        return n1 + n2
    }(1,2)
    
  • 可调用多次的匿名函数

    a := func (n1 int, n2 int) int {
        return n1 + n2
    }
    
    a(1,2)
    a(3,4)
    a(5,6)
    
  • 全局匿名函数

    var (
        gFun = func(n1 int, n2 int) int {
            return n1 + n2
        }
    )
    

闭包

闭包就是 一个函数A中定义另外一个函数B
且函数B中有使用到函数A中的局部变量,且函数A将函数B返回

defer

  • 作用

    defer是函数的延时执行机制
    defer语句当函数结束时才调用
    defer语句一般用于释放资源
    
  • 注意

    多个defer语句会放到一个栈中
    即最先声明的defer语句会在最后执行
    当语句入栈时,也会将相关的值进行拷贝
    

函数参数传递方式

  • Go语言一种有两大类数据类型:值类型 ;引用类型
  • Go中值类型包括:int系列,float系列,complex系列,bool,string,数组和结构体
  • Go中引用类型包括:slice,map,chan,interface,指针
  • 值类型的默认传递方式是值传递,引用类型的默认传递方式是引用传递

内置函数

  • len:用来求长度,如string,array,slice,map,channel

  • new:用来分配内存,主要用于分配值类型

    numPtr := new(int) 这个numPtr是 *int 类型
    
  • make:用来分配内存,主要用于分配引用类型

  • cap:求切片的容量

错误处理机制

panic-defer-recover机制

  • 默认情况下,当发生错误(panic)后,程序就会崩溃
  • 如果希望当发生 panic 后,可以捕捉到 panic,并进行处理,使程序不崩溃,则需要进行错误处理
  • Go语言不支持传统的 try…catch…finally,而是使用 defer, panic, recover机制
  • 流程:抛出一个panic,然后在 defer 语句中通过 recover 函数捕获这个 panic,并处理
func main() {
   
   test()
   fmt.Println("尽管发生了 panic,程序还是继续执行了")
   
}

func test() {
   defer func() {
       err := recover() // recover内置函数,可以捕获异常
       if err != nil {
           fmt.Println("err=",err)
       }
   }()
   
   num1 := 10
   num2 := 0
   res := num1 / num2
   fmt.Println(res)
}

自定义异常

  • 使用errors.New和panic内置函数

    • error.New(“错误说明”),返回一个 error 类型的值,表示一个错误
    • panic(),内置函数,接收任意值作为参数,引发异常
    import "errors"
    
    func readConf(name string) (err error) {
        if name == "config.ini" {
            return nil
        } else {
            return errors.New("读取配置文件错误")
        }
    }
    
    func test() {
        err := readConf("config.ini")
        if err != nil {
            panic(err)
        }
    }
    

注意事项

  • panic可以在任何位置引发,但是 recover 只能在 defer 中调用
  • panic(“message”) 指定 panic 发生时显示的信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/769577.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为 eNSP 模拟器 配置RIP实例 动态路由协议

1 实验拓扑 2 配置路由器 #R1 Huawei>sys [Huawei]sysname R1 [R1]interface GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 255.255.255.0 [R1-GigabitEthernet0/0/0]qu [R1]rip [R1-rip-1]network 192.168.1.0 [R1-rip-1]version 2 [R1-rip-…

C++:求梯形面积

梯形面积 已知上底15厘米&#xff0c;下底25厘米&#xff0c;问梯形面积值是多少&#xff1f; #include<iostream> using namespace std; int main() {//梯形的面积公式&#xff08;上底下底&#xff09; 高 2//上底变量、下底变量int s,d,h,m;s15;d25;h 2*150 * 2/s ;…

Bootstrap 图片

Bootstrap 图片 Bootstrap 是一个流行的前端框架,它提供了一套丰富的工具和组件,用于快速开发响应式和移动优先的网页。在本文中,我们将探讨如何使用 Bootstrap 来处理和展示图片,包括图片的响应式设计、图片样式和图片布局。 响应式图片 Bootstrap 通过其栅格系统提供了…

接口自动化测试高频面试题

一、json和字典的区别&#xff1f; json就是一个文本、字符串&#xff1b;有固定的格式&#xff0c;格式长的像python字典和列表的组合&#xff1b; 以key-value的键值对形式来保存数据&#xff0c;结构清晰&#xff0c;。可以说是目前互联网项目开发中最常用的一种数据交互格…

k8s record 20240703

1. containerd 它不用于直接和开发人员互动&#xff0c;在这方面不和docker竞争 containerd的用时最短&#xff0c;性能最好。 containerd 是容器的生命周期管理&#xff0c;容器的网络管理等等&#xff0c;真正让容器运行需要runC containerd 是一个独立的容器运行时&am…

PyTorch环境配置及安装

PyTorch环境配置及安装 Step1&#xff1a;安装Anaconda 参考该链接&#xff08;视频01:30--03:00为安装教程&#xff09;&#xff1a; 【PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】】 https://www.bilibili.com/video/BV1hE41…

AIGC在软件开发中的应用

目录 1. AIGC技术概述1.1 定义与背景1.2 发展历程 2. AIGC在软件开发中的应用2.1 代码生成2.2 错误检测与修复2.3 自动化测试 3. AIGC对开发者职业前景的影响3.1 助力与赋能开发者代码示例&#xff1a;自动化测试 3.2 技能需求转变与职业转型压力代码示例&#xff1a;AIGC辅助的…

鸿翼FEX文件安全交换系统,打造安全高效的文件摆渡“绿色通道”

随着数字经济时代的到来&#xff0c;数据已成为最有价值的生产要素&#xff0c;是企业的重要资产之一。随着数据流动性的增强&#xff0c;数据安全问题也随之突显。尤其是政务、金融、医疗和制造业等关键领域组织和中大型企业&#xff0c;面临着如何在保障数据安全的同时&#…

《数字图像处理与机器视觉》案例四 基于分水岭算法的粘连物体的分割与计数

一、引言 分水岭算法&#xff08;Watershed Algorithm&#xff09;&#xff0c;是一种基于拓扑理论的数学形态学的分割方法&#xff0c;其基本思想是把图像看作是测地学上的拓扑地貌&#xff0c;图像中每一点像素的灰度值表示该点的海拔高度&#xff0c;每一个局部极小值及其影…

少儿编程 2024年6月电子学会图形化编程等级考试Scratch一级真题解析(选择题)

2024年6月scratch编程等级考试一级真题 选择题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1、音乐Video Game1的时长将近8秒&#xff0c;点击一次角色&#xff0c;下列哪个程序不能完整地播放音乐两次 A、 B、 C、 D、 答案&#xff1a;D 考…

Socket编程用到的函数TCP UDP实例

最基本的 Socket 模型 参考这次答应我&#xff0c;一举拿下 I/O 多路复用&#xff01; (qq.com) Socket编程详解-CSDN博客 Socket是一种通信机制&#xff0c;通过它可以在不同主机之间进行数据交换。在Socket编程中&#xff0c;有两种常见的通信模式&#xff1a;客户端-服务…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于目标鲁棒的电动汽车及基站储能联合参与电力市场的决策模型 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Go语言--递归函数

递归函数 递归指所数可以直接或问接的调用自身。递归函数通常有相同的结构:一个跳出条件和一个递归体。所谓跳出条件就是根据传入的参数判断是否需要停止递归&#xff0c;而递归体则是函数自身所做的一些处理。 普通函数的调用流程 递归函数调用流程 一定要写终止条件。 实现…

【C++】初步认识C++

1. 初识C1.1 C概念相关1.2 C发展史及其重要性1.2.1 发展史1.2.2 重要性 2. C关键字3. 命名空间4. 输入和输出 个人主页&#xff1a;C_GUIQU 归属专栏&#xff1a;【C学习】 1. 初识C 1.1 C概念相关 C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。 【来源】…

Unity游戏帧率查看软件Fraps

Download Fraps 3.5.99 free version 下载、安装、运行这个软件&#xff0c;左上角就会自动显示帧率

跑腿平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;基础数据管理&#xff0c;管理员管理&#xff0c;接单详情管理&#xff0c;跑腿员管理&#xff0c;跑腿任务管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;跑腿任务&#xff0c;接单员&…

windows上安装Frida环境

python安装 下载地址 Python Release Python 3.12.4 | Python.org python安装好后&#xff0c;使用如下命令安装frida客户端 pip install frida-tools 使用frida --version 查看frida版本 安装手机模拟器&#xff08;雷电模拟器&#xff09; 我的版本是4.0.61 查看CPU架构 adb …

SpringCloud进阶篇

文章目录 网关快速入门创建模块引入依赖修改启动类配置路由路由过滤(一般不用) 自定义GlobalFilter登录校验登录校验过滤器 微服务获取用户信息保存用户信息到请求头拦截器获取用户信息 OpenFeign传递用户信息配置共享添加共享配置拉取共享配置 配置热更新添加配置到Nacos配置热…

从零开始的python学习生活

第一天 pycharm部分好用快捷键 变量名的定义 与之前学习过的语言有所不同的是&#xff0c;python中变量名的定义更加的简洁 such as 整形。浮点型和字符串的定义 money50 haha13.14 gaga"hello"字符串的定义依然是需要加上引号&#xff0c;也不需要写&#xff1b;…

【docker】运行阶段遇到的问题

目录 1、查询docker 下挂载了哪些工具 2、docker中的简单命令 3、实际场景应用&#xff08;redis&#xff09; 目前工作中仅用到了redis,所以没有太多经验可以交流&#xff0c;暂时仅将我目前遇到的进行发布。还请见谅。 1、查询docker 下挂载了哪些工具 docker ps -a 或者…