首页 > 其他分享 >Go语法糖

Go语法糖

时间:2023-08-21 13:56:38浏览次数:39  
标签:defer nil fmt 语法 func Go recover panic

:= 和 var

  1. 短变量声明:使用 := 操作符可以在不显式指定变量类型的情况下,根据右侧的表达式自动推断变量类型。这种方法声明和定义绑定在一起一步到位。
name := "Pey"
  1. var:go中定义过的变量必须使用,不然会报错。使用var既可以只声明变量,也可以同时定义变量。
var name string						// 只声明
var name string = "Pey"		// 同时定义

Tips: 声明全局变量(包级别变量)一般只能用var(在func之外声明)

panic, recover, defer

defer 语句用于注册一个函数调用,在包含它的函数结束时执行,无论正常结束还是发生异常。这使得资源释放等操作更容易管理。

  1. panicpanic 用于引发异常(panic),表示程序发生了不可恢复的错误。当程序出现无法处理的错误时,可以使用 panic 来停止程序的正常执行,并立即终止当前函数的执行流程。panic 接受一个任意类型的参数,通常是用来描述导致异常的原因。

    示例:

    Codefunc divide(a, b int) int {
        if b == 0 {
            panic("除数不能为零")
        }
        return a / b
    }
    
    func main() {
        fmt.Println(divide(10, 0))
    }
    

    在上述示例中,当除数 b 的值为 0 时,会触发一个 panic,并传递描述信息 "除数不能为零"。这将导致程序的执行立即停止,并抛出一个运行时异常。

  2. recoverrecover 用于捕获并处理 panic 引发的异常。它只能在 defer 函数中被调用,并且可以用于恢复程序的正常执行流程。当 recover 被调用时,它会返回导致 panic 的错误信息,如果没有发生 panicrecover 返回 nil

    示例:

    Codefunc divide(a, b int) (result int, err error) {
        defer func() {
            if r := recover(); r != nil {
                err = fmt.Errorf("发生了错误:%v", r)
            }
        }()
    
        if b == 0 {
            panic("除数不能为零")
        }
    
        return a / b, nil
    }
    
    func main() {
        result, err := divide(10, 0)
        if err != nil {
            fmt.Println(err)
        } else {
            fmt.Println("结果:", result)
        }
    }
    

    在上述示例中,通过使用 defer 关键字延迟执行匿名函数,并在其中调用 recover() 函数。在函数内部,我们检查 recover 的返回值是否为 nil,如果不为 nil,则说明发生了 panic,我们可以在此处捕获到异常并进行处理。

需要注意的是,panic 可以逐层向上传播,直到被恢复或者程序终止。通常情况下,panic 应该被视为一种无法恢复的错误,并且应该仅在遇到真正严重的问题时使用。使用 recover 来处理 panic 是一种可选的方式,可以用来优雅地处理某些特定场景下的异常情况。

一个recover可以捕获多个不同panic(不同时)

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("捕获到panic:", r)
        }
    }()

    go func() {
        defer func() {
            if r := recover(); r != nil {
                fmt.Println("捕获到panic:", r)
            }
        }()
        panic("第一个panic")
    }()

    go func() {
        panic("第二个panic")
    }()

    time.Sleep(time.Second) // 等待goroutines执行完成
}

range 循环:

range 关键字可以用于遍历数组、切片、字符串、字典等数据结构,提供了一种简洁的方式来迭代元素。例如:

Codenumbers := []int{1, 2, 3, 4, 5}
// i 为索引
for i, num := range numbers {
    fmt.Println(i, num)
}

struct 字面量初始化

在初始化结构体时,可以省略字段名称,只提供对应的值列表。编译器会根据字段的顺序进行匹配赋值。例如:

type Person struct {
  Name string
  Age  int
}
Codeperson := Person{"John", 30} // 可以省略 Person{Name: "John", Age: 30}

标签:defer,nil,fmt,语法,func,Go,recover,panic
From: https://www.cnblogs.com/peychou/p/17645802.html

相关文章

  • 编译原理 语法分析器
    时间:2014-6-9作者:顾博君 /*0.Z->S1.S->while(E)S2.S->E;3.S->;4.E->i=E5.E->T6.T->T+P7.T->P8.P->P*F9.P->F10.F->i11.F->(E)12.F->num--------------------------------------||--------......
  • Django 解决同源跨域问题
    Django解决同源跨域问题目录Django解决同源跨域问题1sitea1.1urls配置1.2app01.views配置1.3index.html配置2siteb2.1urls配置2.2app01.views配置由于浏览器具有同源策略的限制:在发送Ajax请求时,如果当前浏览器的URL是a.com,而页面中向b.com发送ajax请求,请求可以正......
  • django 上传文件
    前后端分离下django框架上传文件实现方式实现方式一,通过model字段FileFiled()来实现model类classReport(models.Model):p_id=models.PositiveIntegerField('病人ID')file=models.FileField(upload_to='uploads/report/%Y/%m/%d/')def__str__(self):......
  • Nginx中location语法有哪些?【杭州多测师_王sir】
     1、location 介绍location是Nginx中的块级指令(block directive),location指令的功能是用来匹配不同的url请求,进而对请求做不同的处理和响应,这其中较难理解的是多个location的匹配顺序,本文会作为重点来解释和说明。开始之前先明确一些约定,我们输入的网址叫做请求URI,nginx用请......
  • 网站LOGO
    网站LOGO<ahref="{$site[site_url]}"><imgsrc="{$site[site_logo]}"title="{$site[site_name]}"></a>版权声明{$site[site_copyright]}网站备案号备案号:<ahref="http://beian.miit.gov.cn/"target="_blank&......
  • 利用pycharm创建第一个django API项目
    From:  ICT浪子 ICT浪子 2023-08-1916:34 发表于湖北---------------------------------------------------------------------------一、pycharm操作1、打开PyCharm,进入欢迎界面。2、点击"CreateNewProject"或选择"File"->"NewProject"。3、在新项目对话框中,......
  • 【pandas小技巧】--category类型补充
    category类型在pandas基础系列中有一篇介绍数据类型的文章中已经介绍过。category类型并不是python中的类型,是pandas特有的类型。category类型的优势那篇文章已经介绍过,当时只是介绍了如何将某个列的数据转换成category类型,以及转换之后给程序性能上带来的好处。本篇将补充介绍......
  • golang.org/x/子仓库
    在Go语言的生态中,golang.org/x/是一个特殊的前缀,它表示一系列Go子仓库,这些子仓库包含了Go核心开发团队维护的实验性或辅助工具、库和包。这些仓库可能不会被包含在Go的标准库中,但它们仍然由Go的核心维护者维护,并且通常有很高的质量标准。这些golang.org/x/子仓库在......
  • Google classic interview questions, throwing eggs the least number of times All
    Googleclassicinterviewquestions,throwingeggstheleastnumberoftimesAllInOne谷歌经典面试题,扔鸡蛋最少次数14✅你在一栋100层的大楼里工作,你得到2个相同的鸡蛋。你需要计算出鸡蛋可以掉落到最高的楼层而不破裂。问题是你需要投掷多少次。找到一种在......
  • MongoDB的性能监控和故障排除的强大工具FTDC(Full-Time Diagnostics Capture)
    MongoDB的FTDC(全时诊断捕获)是一项强大的诊断功能,可捕获关于MongoDB数据库性能、操作和行为的详细信息。它为数据库的运行提供了有价值的深入洞察,有助于性能监控和故障排除。在本文中,将深入探讨MongoDB的FTDC(全时诊断数据捕获)功能的强大功能。将探讨它如何捕获有关MongoDB实例......